多基派生中的多条路径具有公共基类时,在这条路径的汇合处就会因对公共基类产生多个拷贝而产生同名函数调用的二义性。解决这个问题的办法就是把公共基类定义为虚基类,使由它派生的多条路径的汇聚处只产生一个拷贝。
class Base{ }; class A : public Base{ }; class B: public Base{ }; class C: public A, public B{ };
类C中继承了两个类Base,即有两个类Base的实现部分,在调用时产生了二义性。
由虚基类派生出的对象初始化时,直接调用虚基类的构造函数。因此,若将一个类定义为虚基类,则一定有正确的构造函数可供所有派生类调用。用虚基类进行多重派生时,若虚基类没有缺省的构造函数,则在每一个派生类的构造函数中都必须有对虚基类构造函数的调用 (且首先调用)。
1、未定义为虚基类的情况如下:
class base{ public: virtual void a(){ cout<<"a() in base\n";} virtual void b(){ cout<<"b() in base\n";} virtual void c(){ cout<<"c() in base\n";} virtual void d(){ cout<<"d() in base\n";} virtual void e(){ cout<<"e() in base\n";} virtual void f(){ cout<<"f() in base\n";} }; class A:public base{ public: virtual void a(){ cout<<"a() in A\n";} virtual void b(){ cout<<"b() in A\n";} virtual void f(){ cout<<"f() in A\n";} }; class B:public base{ public: virtual void a(){ cout<<"a() in B\n";} virtual void b(){ cout<<"b() in B\n";} virtual void c(){ cout<<"c() in B\n";} }; class C:public A,public B{ public: virtual void a(){ cout<<"a() in C\n";} virtual void d(){ cout<<"d() in C\n";} }; void main(void) { C cc; //将类C的地址赋值时产生歧义 base *pbase=&cc;//错误 A *pa=&cc; pa->a(); pa->b(); pa->c(); pa->d(); pa->e(); pa->f(); }
2、定义为虚基类的情况如下:
#include <iostream> using namespace std; class base{ public: void a(){ cout<<"a() in base\n";} void b(){ cout<<"b() in base\n";} void c(){ cout<<"c() in base\n";} void d(){ cout<<"d() in base\n";} void e(){ cout<<"e() in base\n";} void f(){ cout<<"f() in base\n";} }; class A:virtual public base{ public: void a(){ cout<<"a() in A\n";} void b(){ cout<<"b() in A\n";} void f(){ cout<<"f() in A\n";} }; class B:virtual public base{ public: void a(){ cout<<"a() in B\n";} void c(){ cout<<"c() in B\n";} }; class C:public A,public B{ public: void a(){ cout<<"a() in C\n";} void d(){ cout<<"d() in C\n";} }; int main(void) { C cc; base *pa = &cc; A *pA = &cc; B *pB = &cc; pa->a(); pa->b(); pa->c(); pa->d(); pa->e(); pa->f(); pA->a(); pA->b(); pA->c(); pA->d(); pA->e(); pA->f(); pB->a(); pB->b(); pB->c(); pB->d(); pB->e(); pB->f(); cc.a(); cc.b(); cc.c(); cc.d(); cc.e(); cc.f(); return 0; } 运行结果: a() in base b() in base c() in base d() in base e() in base f() in base a() in A b() in A c() in base d() in base e() in base f() in A a() in B b() in base c() in B d() in base e() in base f() in base a() in C b() in A c() in B d() in C e() in base f() in A
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。
很不错的博客,竟然今天才发现。
呵呵 太技术了 没啥人气 欢迎常来逛逛~
不懂也得装懂一下,呵呵,加油
谢谢,大家一起加油。你的计牌器没用到C++吗?
加油,不过什么语言设计的我不清楚哦,我现在只负责推广一下。
哦哦 原来如此 你们这是一个公司还是大家合伙做的一个项目呢?
是公司,其实我才来实习10天,很多不清楚呢,就是到处发帖留言什么的。
哦哦 刚毕业吧 我也是过来人 好好干吧 😛
呵呵, 会加油的。