C++学习之继承八(多继承剖析)

  1. 多继承的派生类构造和访问
  • 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员
  • 执行顺序:与单继承构造函数类似;多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序
  • 一个派生类对象拥有多个直接或者间接基类的成员;不同成员访问不会出现二义性;如果不同的基类有同名成员,派生类对象访问时应该加以识别

案例:

#include<iostream>
using namespace std;
class B
{
public:
 	int b;
	 B()
	 {
		  cout << "B构造函数\n";
	 }
};
class B1 :  virtual public  B
{
public:
 	int b1;
};
class B2 : virtual public  B
{
public:
	 int b2;
};
class C :public B1, public B2
{
public:
 	int c;
};
void main()
{
	 C c1;
	//c1.b = 500;  //

	//1 不添加virtual关键字,发现 B构造函数执行了两次
	 /*
	 B构造函数
	 B构造函数
	 请按任意键继续. . .
	 */
	
	//2 添加virtual关键字,发现 B构造函数执行了 1 次

	//结论: 若在多继承路径上有一个公共基类, 那么在继承路劲的某处汇合点, 和这个公共基类会在派生类的 对象中 产生多个 基类子对象
	 //  解决方法: 对这个基类声明为 虚继承
	 //  比如 c1::B1::b   c1::B2::b 是同一个子对象
	system("pause");
}
  1. 加上virtual关键字后,C++编译器 会再给变量偷偷增加属性
    案例:
class B
{
public:
	 int b;
};
class B1 : virtual public  B
{
public:
	 int b1;
};
class B2 :  public  B
{
public:
	 int b2;
};
void main()
{
	 cout << sizeof(B) << endl;  //4
	 cout << sizeof(B1) << endl;  //12
	 cout << sizeof(B2) << endl;  //8
	 system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值