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()
,
答案 0 :(得分:1)
当我测试你的例子时,我会得到" 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();
}
你有&#34; Diamond&#34;问题。
A
B D // only B or D can override A::func()
E // can override A::func()
钻石的尖端是A级,它有两个派生自它的类,&#34; B&#34;在钻石的每一边都有&#34; D&#34;只有一个衍生类属于钻石边的一部分可以覆盖钻石尖端的虚拟函数,而不是它们两者(注意钻石的底部可以覆盖,在本例中为E)。在这种情况下,D类覆盖func
。如果B类覆盖func
,它就不会编译。如果上课&#34; B&#34;和&#34; D&#34;不要覆盖任何东西,在你的例子中,将调用A :: func()。
答案 1 :(得分:1)
如果你在D中实现了func,那么就会被调用。你可以在这里看到正在运行的例子
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;
}