栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++多重继承与虚基类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++多重继承与虚基类

前言:

此文章仅作本人学习笔记留存分享。如有出错欢迎指正。

正文:

如果一个派生类从多个基类中派生,而这些基类又有一个共同的基类,则在这个派生类将保留共同基类的多份副本,如下图所示:

要让派生类只保留共同基类的一份副本,可以让这个 共同基类说明为虚基类 。

虚基类的定义格式为 : class 派生类 :virtual [ 继承方式 ] 基类名 代码示例
class A					//共同基类A
{
     public:
	int a;
	void display(){cout<<"共同基类A中的a="<

运行结果如下:

虚基类的构造函数只能调用一次。直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中列出对虚基类的初始化。

注意:

  1. 虚基类的构造函数在所有非虚基类之前调用;
  2. 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
  3. 若虚基类由非虚基派生而来,则先调用基类构造函数,再调用派生类的构造函数

class N				//共同基类的祖先
{
     public:
	N(){cout<<"共同基类的祖先——N类的构造函数"< 
 

调用虚基类的构造函数的方法与调用一般基类的构造函数的方法不同:编译器约定,在执行派生类的构造函数时都不调用虚基类的构造函数,而是在最终派生类的构造函数中直接调用虚基类的缺省构造函数初始化虚基类的数据成员。因此,虚基类定义中一般要包含有缺省的构造函数。

class A{
  public:	
	int x;
	//A(int a=0){x=a;}
};

class B:virtual public A{
   public:
	int y;
	B(int a=0, int b=0):A(b)
	{y=a;}				// 不调用虚基类的构造函数
	void pb( ){cout<<"x="<class A  //内存大小为4  
{   public: int a; 	};  
class B :virtual public A  //变量a,b共8字节,虚基类表指针4  
{   public: int b;   };  
class C :virtual public A  //与B一样12  
{   public: int c;   };  
class D :public B, public C //24,变量a,b,c,d共16,B的虚基类指针4,C的虚基类指针4  
{   public: int d;   };  
void main()  
{   A a;   B b;  
    C c;   D d;  
	cout << "sizeof a:" << sizeof(a) << endl;
	cout << "sizeof b:" << sizeof(b) << endl;
	cout << "sizeof c:" << sizeof(c) << endl;
	cout << "sizeof d:" << sizeof(d) << endl;       
} 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932004.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号