В настоящее время у меня есть дизайн бриллианта, и я увидел соответствующий вопрос Вот
В этом вопросе позвольте мне предположить, что класс B и класс C виртуально унаследованы от класса A, поэтому в классе D, когда нам нужно вызывать виртуальные функции, нам нужно указать, какую из них необходимо вызвать.
D::foo()
{
B::foo(); //specify foo() in B
}
Что касается дизайна бриллиантов, мне нужно переписать много виртуальных функций, чтобы эти функции вызывались правильными функциями родительского класса B или C.
Это нехорошо, нужно много повторять, когда у меня есть дочерний класс, есть ли у вас лучшие решения, чтобы я мог вызывать foo () из B в классе D, но не переписывать для приведенного выше примера.
Начиная с C ++ 11, вы можете делать псевдонимы:
class A
{
public:
virtual void foo() { cout << "A" << endl; }
}class B : public virtual A
{
public:
void foo() { cout << "B" << endl; }
}class C : public virtual A
{
public:
void foo() { cout << "C" << endl; }
}
class D : public B, C
{
using B::foo;
}
Таким образом, делаешь:
D obj;
obj.foo();
Будет выходной B
;
Я думаю, что шаблонные классы могли бы добиться цели здесь.