Сложная ситуация множественного наследования - PullRequest
0 голосов
/ 30 мая 2018

диаграмма классов

class A {public: virtual int func();};
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual int func();};
class E: public B, public D {}; 
// e is an object of E
e->func(); // this will run func defined in A, not in D

У меня ситуация множественного наследования, как в приведенном выше примере.Как я могу реализовать это для вызова наиболее производного метода?(Для вызова func() реализовано в D, а не в A, когда я пишу e->func())

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Если вы внедрили func в D, он будет вызван.Вы можете увидеть бегущий пример здесь

https://ideone.com/kwJubg

class A {public: virtual int func(){cout<<"In A";};};
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual int func(){cout<<"In D";};};
class E: public B, public D {}; 


int main()
{
    E *e = new E();
    e->func();    
    return 0;
}
0 голосов
/ 30 мая 2018

Когда я проверяю ваш пример, я получаю "D", а не "A", как вы упомянули.

class A {public: virtual void func() {std::cout << "A" << std::endl;} };
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual void func() {std::cout << "D" << std::endl;} };
class E: public B, public D {};

int main()
{
  E e {};
  e.func();
}

У вас есть проблема "Diamond".

   A  
 B   D  // only B or D can override A::func()  
   E    // can override A::func()

Кончик Алмаза - это класс А, и у него есть два класса, производных от него, «В» и «D», на каждой стороне алмаза.Только один из производных классов, являющихся частью сторон алмаза, может переопределить виртуальную функцию с кончика алмаза, но не оба из них (обратите внимание, что нижняя часть алмаза может переопределить, в этом случае E).В этом случае класс D, который переопределяет func.Если класс B переопределит func, он не скомпилируется.Также, если класс «B» и «D» ничего не переопределяют, в вашем примере будет вызвана A :: func ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...