为什么C++需要虚继承

    xiaoxiao2025-03-22  16

    先看个编译多继承带来的编译错误

    /************************************************************************* > File Name: muti_inherit.cpp > Author: guoqingyao > Mail: stepbystepto@163.com > Created Time: 2016年08月11日 星期四 12时38分35秒 ************************************************************************/ #include<iostream> using namespace std; class A { public: int a; }; class B : public A { }; class C : public A { }; class D : public B, public C { }; int main() { D d; d.a = 1; return 0; }

    编译错误

    dotheright@dotheright:~/mylovelycodes/cpp/base/9$ g++ muti_inherit.cpp muti_inherit.cpp: In function ‘int main()’: muti_inherit.cpp:31:4: error: request for member ‘a’ is ambiguous d.a = 1; ^ muti_inherit.cpp:13:6: note: candidates are: int A::a int a; ^ muti_inherit.cpp:13:6: note: int A::a 这里出现的错误是d.a 有二义性,这时候我们就要找二义分别是指的什么? 变量a的一种继承关系

    Created with Raphaël 2.1.0 D D B B A A 继承于 继承于

    变量a的另一种继承关系

    Created with Raphaël 2.1.0 D D C C A A 继承于 继承于

    A 由两份copy 所以会有二义性,消除二义性就是A只留一份,需要用到虚继承

    /************************************************************************* > File Name: muti_inherit.cpp > Author: guoqingyao > Mail: stepbystepto@163.com > Created Time: 2016年08月11日 星期四 12时38分35秒 ************************************************************************/ #include<iostream> using namespace std; class A { public: int a; }; class B :virtual public A { }; class C :virtual public A { }; class D : public B, public C { }; int main() { D d; d.a = 1; return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1297276.html
    最新回复(0)