избегать указания функций для вызова в алмазном дизайне

В настоящее время у меня есть дизайн бриллианта, и я увидел соответствующий вопрос Вот

В этом вопросе позвольте мне предположить, что класс B и класс C виртуально унаследованы от класса A, поэтому в классе D, когда нам нужно вызывать виртуальные функции, нам нужно указать, какую из них необходимо вызвать.

D::foo()
{
B::foo(); //specify foo() in B
}

Что касается дизайна бриллиантов, мне нужно переписать много виртуальных функций, чтобы эти функции вызывались правильными функциями родительского класса B или C.

Это нехорошо, нужно много повторять, когда у меня есть дочерний класс, есть ли у вас лучшие решения, чтобы я мог вызывать foo () из B в классе D, но не переписывать для приведенного выше примера.

0

Решение

Начиная с 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;

1

Другие решения

Я думаю, что шаблонные классы могли бы добиться цели здесь.

http://www.cplusplus.com/doc/tutorial/templates/

-3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector