Я использую множественное наследование в C ++ и расширяю базовые методы, явно вызывая их базовые методы. Предположим следующую иерархию:
Creature
/ \
Swimmer Flier
\ /
Duck
Что соответствует
class Creature
{
public:
virtual void print()
{
std::cout << "I'm a creature" << std::endl;
}
};
class Swimmer : public virtual Creature
{
public:
void print()
{
Creature::print();
std::cout << "I can swim" << std::endl;
}
};
class Flier : public virtual Creature
{
public:
void print()
{
Creature::print();
std::cout << "I can fly" << std::endl;
}
};
class Duck : public Flier, public Swimmer
{
public:
void print()
{
Flier::print();
Swimmer::print();
std::cout << "I'm a duck" << std::endl;
}
};
Теперь это представляет проблему - вызов метода print
утки вызывает соответствующие базовые методы, каждый из которых, в свою очередь, вызывает метод Creature::print()
, поэтому в итоге он вызывается дважды -
I'm a creature
I can fly
I'm a creature
I can swim
I'm a duck
Я хотел бы найти способ убедиться, что базовый метод вызывается только один раз. Нечто похожее на то, как работает виртуальное наследование (вызов базового конструктора при первом вызове, а затем присвоение ему указателя только при последующих вызовах из других производных классов).
Есть ли какой-то встроенный способ сделать это или нам нужно прибегнуть к его реализации самостоятельно?
Если да, то как вы подойдете к этому?
Вопрос не только в печати. Мне было интересно, есть ли механизм для расширения базовых методов и функциональности, сохраняя порядок вызовов и избегая проблемы с ромбами.
Теперь я понимаю, что наиболее заметным решением было бы добавить вспомогательные методы, но я просто подумал, есть ли более «чистый» способ.
std::cout
, чтобы вы могли выбрать, какую именно версию вызывать. - person Jarod42   schedule 24.04.2019