四十二、继承与派生:虚基类及其派生类的构造函数
2015-05-15 15:42
453 查看
1、虚基类的概念,为什要有虚基类? 当派生类的多个基类有共同基类时,派生类继承而来的成员有相同名称,定义对象之后同名成员在内存中有多份数据成员和函数成员的拷贝,明显造成了内存浪费。 虚基类:将派生类直接基类的共同基类声明为虚基类。这样派生类从不同直接基类继承而来的同名数据成员在内存中就会只有一份拷贝(同名成员函数只有一个映射)。实现了唯一标识同名成员,也节省内存空间。 虚基类声明方式:
class 派生类名:virtual 继承方式 基类名
<pre><span style="font-family:Microsoft YaHei;"></span><pre name="code" class="cpp">#include<iostream> using namespace std; class Base0 { public: voidshow(){cout<<"x of Base0 "<<x<<endl;} intx; //public,不然派生类无法访问 }; class Base1 : virtual public Base0 //Base0为虚基类,公有派生Base1类 //virtual和继承方式一样,只限定紧跟在它后面的类 { }; class Base2 :virtual public Base0 { }; class child:public Base1,public Base2 { }; int main() { childd; d.x=1; //数据成员x只有一份副本 d.show(); return0; }从上面我们可以看到,声明虚基类只需要在它的派生类声明时使用关键字virtual修饰。
2、虚基类派生类的构造函数
上面没有定义构造函数,所以使用了默认构造。当定义带参构造时,虚基类直接或间接被派生类继承,必须在派生类构造函数成员初始化列表中给出对虚基类成员的初始化。
#include<iostream> using namespace std; class Base0 { public: Base0(inty){x=y;} voidshow(){cout<<"x of Base0 "<<x<<endl;} intx; //public,不然派生类无法访问 }; class Base1 : virtual public Base0 //Base0为虚基类,公有派生Base1类 { public: Base1(inty):Base0(y){} //必须在构造函数成员初始化列表中给出对虚基类成员的初始化 }; class Base2 :virtual public Base0 { public: Base2(inty):Base0(y){} }; class child:public Base1,public Base2 //最远派生类 { public: child(inty):Base0(y),Base1(y),Base2(y){} //由child构造函数调用Base0的构造函数来初始化,其他类的构造函数忽略 }; int main() { childd(1); d.show(); return0; }上面代码中,我们可能会认为调用了三个类的构造函数,也就是x被初始化了三次。但事实并不是这样.
编译器特殊处理:如果构造的对象有从虚基类继承而来的成员,成员的初始化只由最远派生类的构造函数调用虚基类的构造函数来完成。上面child就是最远派生类,并由其构造函数调用Base0的构造函数完成,其他如Base1-2的被忽略。
相关文章推荐
- C++编程入门系列之四十二(继承与派生:虚基类及其派生类的构造函数)
- 鸡啄米:C++编程入门系列之四十二(继承与派生:虚基类及其派生类的构造函数)
- 继承与派生:虚基类及其派生类的构造函数
- 二十七、继承(四) 多重继承、虚继承与虚基类、虚基类及其派生类构造函数
- C++编程入门系列之三十九(继承与派生:派生类的构造函数)
- 继承与派生:派生类的构造函数
- 三十九、继承与派生:派生类的构造函数****
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
- 继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 虚基类及其派生类的构造函数
- 继承与派生3:派生类的构造函数与析构函数
- 【C++继承与派生之二】有子对象的派生类的构造函数
- 【继承与派生】SDUT 2713 - 5-3 多级派生类的构造函数
- 鸡啄米:C++编程入门系列之三十七(继承与派生:派生类对基类成员的访问控制之公有继承)
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- 继承与派生4:派生类中对基类成员的重定义
- C++编译器:虚基类及其派生类的构造函数
- 继承 和派生 基类 超类 父类 派生类 子类
- 继承与派生5:基类与派生类之间的转换
- 鸡啄米:C++编程入门系列之三十八(继承与派生:派生类对基类成员的访问控制之保护继承与私有继承)