Я использую множественное наследование в 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;
}
};
Теперь это создает проблему - вызов метода duck print
вызывает соответствующие базовые методы, каждый из которых, в свою очередь, вызывает метод Creature::print()
, поэтому в итоге он вызывается twice-
I'm a creature
I can fly
I'm a creature
I can swim
I'm a duck
Я хотел бы найти способ убедиться, что базовый метод вызывается только один раз. Нечто подобное тому, как работает виртуальное наследование (вызов базового конструктора при первом вызове, а затем только присвоение ему указателя при последующих вызовах из других производных классов).
Есть ли какой-то встроенный способ сделать это или нам нужно прибегнуть к его реализации самостоятельно?
Если так, как бы вы подошли к этому?
Вопрос не относится к печати. Я задавался вопросом, существует ли механизм для расширения базовых методов и функциональности, сохраняя при этом порядок вызовов и избегая проблемы с бриллиантами.
Теперь я понимаю, что наиболее выдающимся решением было бы добавление вспомогательных методов, но мне просто было интересно, есть ли "более чистый" способ.