继承与派生的概念派生类的声明方式派生类的构成派生.ppt

继承与派生的概念派生类的声明方式派生类的构成派生.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 现在,将类A声明为虚基类,方法如下: class A//声明基类A {…}; class B :virtual public A //声明类B是类A的公用派生类,A是B的虚基类 {…}; class C :virtual public A //声明类C是类A的公用派生类,A是C的虚基类 {…}; 注意: 虚基类并不是在声明基类时声明的,而是在声明派生 类时,指定继承方式时声明的。因为一个基类可以在生成一个派 生类时作为虚基类,而在生成另一个派生类时不作为虚基类。声 明虚基类的一般形式为 class 派生类名: virtual 继承方式 基类名 经过这样的声明后,当基类通过多条派生路径被一个派生类 继承时,该派生类只继承该基类一次。 在派生类B和C中作了上面的虚基类声明后,派生类D中的成员 如图5.23所示。 需要注意: 为了保证虚基类在派生类中只继承一次,应当在该 基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的 多次继承。如果像图5.24所示的那样,在派生类B和C中将类A声明 为虚基类,而在派生类D中没有将类A声明为虚基类,则在派生类E 中,虽然从类B和C路径派生的部分只保留一份基类成员,但从类D 路径派生的部分还保留一份基类成员。 图5.23 图5.24 D类 int data; int data_b; int data_c void fun( ); int data_d; void fun_d( ); 2. 虚基类的初始化 如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造 函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过 构造函数的初始化表对虚基类进行初始化。例如 class A//定义基类A {A(int i){ } //基类构造函数,有一个参数 …}; class B :virtual public A //A作为B的虚基类 {B(int n):A(n){ } //B类构造函数,在初始化表中对虚基类初始化 …}; class C :virtual public A //A作为C的虚基类 {C(int n):A(n){ } //C类构造函数,在初始化表中对虚基类初始化 …}; class D :public B,public C //类D的构造函数,在初始化表中对所有基类初始化 {D(int n):A(n),B(n),C(n){ } …}; 注意: 在定义类D的构造函数时,与以往使用的方法有所不同。 规定: 在最后的派生类中不仅要负责对其直接基类进行初始化, 还要负责对虚基类初始化。 C++编译系统只执行最后的派生类对虚基类的构造函数的调用, 而忽略虚基类的其他派生类(如类B和类C) 对虚基类的构造函数的 调用,这就保证了虚基类的数据成员不会被多次初始化。 3. 虚基类的简单应用举例 例5.9 在例5.8的基础上,在Teacher类和Student类之上增加 一个共同的基类Person,如图5.25所示。作为人员的一些基本数 据都放在Person中,在Teacher类和Student类中再增加一些必要 的数据。 图5.25 #include iostream #include string using namespace std; //声明公共基类Person class Person {public: Person(string nam,char s,int a)//构造函数 {name=nam;sex=s;age=a;} protected: //保护成员 string name; char sex; int age;}; //声明Person的直接派生类Teacher class Teacher:virtual public Person //声明Person为公用继承的虚基类 {public:

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档