- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章继承与派生.ppt
class C: virtual public A { protected: int c; }; class D: public B, public C { public: int g(); private: int d; }; A类 void f() int a B类 int a void f() int b C类 int a void f() int c D类 int B::a int C::a void B:: f() void C::f() int b int c int d int g() 从基类继承的成员 派生类D增加的成员 A类 void f() int a B类 int a void f() int b C类 int a void f() int c D类 int a void f() int b int c int d int g() 从基类继承的成员 派生类D增加的成员 例中,类A 是类D 的虚基类。类A,类B,类C 和类D 之间的关系用DAG图示如下: A(f(),a) B(b) C(c) D(g(),d) 从图中可见,虚基类子对象被合并成一个子对象,这种“合并”作用,使得可能出现的二义性被消除。 下面访问是正确的: void D::g(); { f(); //合法 } D dd; A *pd; pd=dd; //合法 指向基类指针可访问派生类对象 C++规定,虚基类子对象是由最近派生类的构造函数通过调用虚基类的构造函数进行初始化的。 如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生类或间接派生类)中,通过构造函数的初始化表对虚基类进行初始化。 虚基类的初始化 class A {A ( int i ) { }…}; class B : virtual public A {B ( int n ) :A(n){ }…}; class C : virtual public A {C ( int n ) :A(n){ }…}; class D : public B , public C {D ( int n ) :A(n),B(n),C(n) { }…}; 虚基类在派生类中只有一份数据成员,所以这份数据成员的初始化必须由派生类直接给出。若由BC给出则可能给出不同的值,出现矛盾。 C++ 支持类的继承机制,继承是面向对象设计的重要概念之一。 派生类的成员函数和友元函数可以访问基类的所有公有和保护的数据成员和成员函数。 派生类对象只能访问基类的公有数据成员和成员函数。 小结 1、派生类的构造函数 派生类名(总参数表):基类构造函数名(参数表1), 子对象名(参数表2) { //派生类中数据成员的初始化 } 构造函数的调用顺序如下: 基类构造函数; 子类构造函数; 派生类构造函数。 2、派生类的析构函数 执行派生类的析构函数时,也要调用基类及子对象的析构函数。 析构顺序如下: 先调用派生类的析构函数; 子对象的析构函数; 基类的析构函数。 #include iostream.h class Base { public: Base() { cout“\n Base created\n”; } }; class D_class:public Base { public: D_class() { cout“D_class created\n”; } }; void main() { D_class d; } 例如:下面程序显示了构造函数的执行顺序 运行结果: Base created D_class created 先执行基类的构造函数,再执行派生类的构造函数;执行缺省的析构函数时,先执行派生类,再执行基类。 例:分析程序的输出结果,分析派生类构造函数及析构函数的特点。 #include iostream.h class A { public: A( ) { a=0; } A(int i) { a=i; } void print( )
文档评论(0)