主要用在多重继承,而多重继承不要乱用,否则后果不堪设想,一般用单重继承即可。所以虚基类,不用花太多工夫。
A
/ \
B C
\ /
D
这样,如果不用虚继承,在类D的对象中就会有两份A的拷贝(分别由B,C创建而来),因而产生了模糊性,为了防止这样的情况出现,可以采用虚基类:
class A{};
class B:virtual(在这) public A{};
class C:virtual (在这)public B{};
class D:public B,public C{}这样就好了! 我个人认为要弄明白”友元函数“才是对的
A
/ \
B \
\ \
C \
\ /
D
如果虚基类A是这样一种层次结构,A中有成员函数f(),B中也有成员函数f(),若定义对象 D d;
此时调用d.f();
是调用B::f()还是A::f()?
在vc中是前者
但按所谓的覆盖原则,应该是直接基类覆盖间接基类
这里A既是D的直接基类,又是继承比较深的间接基类,当然是虚基类了,
它是按什么原则来消除二义性的呢?
A
/ \
B C
\ /
D
这样,如果不用虚继承,在类D的对象中就会有两份A的拷贝(分别由B,C创建而来),为了防止这样的情况出现,可以采用虚基类:
class A{};
class B:virtual public A{};
class C:virtual public B{};
class D:public B,public C{}
titilima(李马)
说的是抽象基类,不是虚基类。
多继承体系中:
class B{};
class A : public B{};
class C : public B{};
class D : public A, public C{};
A里有个B,C里也有个B,则D里会有两个B。
如果
class B{};
class A : virtual public B{};
class C : virtual public B{};
class D : public A, public C{};
B是A,C,以及更高层D的虚基类,此时
A里有个B,C里也有个B,但D里只有一个B。