正文

多重继承和虚基类2009-02-28 21:21:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41137.html

分享到:

//派生类成员函数对基类成员函数的覆盖 #include "stdafx.h" #include<iostream> class A { public:      void Show()      {          std::cout<<"A::Show\n";      } };   class B:public A { public:      void Show()      {          std::cout<<"B::Show\n";      }      void Display()      {          Show();//调用派生类B的成员函数,覆盖掉继承自基类的Show()成员方法          A::Show();//调用基类A的成员函数      } }; int _tmain(int argc, _TCHAR* argv[]) {      A a;      B b;      a.Show();      b.Show();      b.Display();      std::cin.get(); } 程序运行的结果: A::Show B::Show B::Show A::Show 一个派生类对象含有基类的数据成员的一个副本,在C++类的多重继承结构中,由于多层次的交叉派生关系,一个派生类中可能保留某个基类的多个实例。例如,在下图中,B:A,C:A,D:B,D:C,这是在派生类D的对象中存在间接基类A的两份副本。当试图通过派生类对象直接访问基类A中的成员是,将会导致编译二义性错误。   //多重继承的副本二义性 class A { public:      int a;//a };   class B:public A { public:      int b;//a,b }; class C:public A { public:      int c;//a,c }; class D:public B,public C { public:      int d;//(a,b),(a,c),d };   int _tmain(int argc, _TCHAR* argv[]) {      D d1;      d1.a=100;//此处a具有二义性,编译器无法确定a是那个副本      d1.B::a=100;//指明访问的是通过B类间接派生的      d1.C::a=100;//指明访问的是通过C类间接派生的 } 编译结果:error C2385: ambiguous access of 'a' 若注释掉d1.a=100;则编译通过。 在多重继承中,C++提供了虚基类(virtual base class)来解决二义性的问题。虚基类只是一种派生的方式,类层次结构中某个虚基类成员只出现一次,即基类的一个副本被所有派生类对象共享。 修改上例代码中B,C的派生方式则d1.a=100;是合法的。 class B:public virtual A { public:      int b;//a,b }; class C:public virtual A { public:      int c;//a,c };

阅读(3221) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册