- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
03C课件继承多继承
继承与派生 多继承举例 多重继承图示 虚基类的构造函数 由于派生类的对象中只有一个虚基类对象。为保证虚基类对象只被初始化一次,这个虚基类构造函数必须只被调用一次。 规定将在建立对象时所指定的类称为最直接派生类。 虚基类对象是由最直接派生类的构造函数通过调用虚基类的构造函数进行初始化的。 从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略。 * 继承与派生 1 继承概述 2 基类和派生类 3 派生类的构造与析构 4 多继承 兼职技术人员 管理人员 销售人员 销售经理 雇员 多继承 一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class 派生类名 : 访问控制 基类名1 , … , 访问控制 基类名n { 数据成员和成员函数声明 }; 多继承 class C : public A ,public B class A class B 类 C 可以根据访问控制同时继承类 A 和类 B 的成员, 并添加自己的成员 多继承的简单应用 class Base1 { public: Base1(int x) { value = x ; } int getData() const { return value ; } protected: int value; }; class Base2 { public: Base2(char c) { letter=c; } char getData() const { return letter;} protected: char letter; }; 7.5.1 多继承的派生类构造和访问 多继承的简单应用 class Derived : public Base1, public Base2 { public : Derived ( int, char, double ) ; double getReal() const ; private : double real ; }; void main() { Base1 b1 ( 10 ) ; Base2 b2 ( k ) ; Derived d ( 5, A, 2.5 ) ; } K 2.5 A 5 10 value letter real Basc1 b1 Basc2 b2 Derived d 多个基类的派生类构造函数用初始化列表调用基类构造函数,执行顺序与单继承构造函数情况类似。 多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。按基类在被继承时所声明的次序从左到右依次调用。 多继承的派生类构造 一个派生类对象拥有多个直接或间接基类的成员。 不同名成员访问不会出现二义性。 如果不同的基类有同名成员,派生类对象访问时应该加 以识别。 多继承的派生类访问 由于多继承情况下,可能造成对基类中某个成员的访问出现了不惟一的情况,则称为对基类成员访问的二义性问题。 A f( ) C A::f(); B::f(); B::g(); g( ); h( ); B f() ; g( ); 二义性和支配原则 class C: public A,public B {? public: ??????? void g(); ??????? void h(); }; 若有C obj; 则对函数 f()的访问是二义的: obj.f(); class A {??? public: ??? void f(); }; class B { public: ??? void f(); ??? void g(); }; 二义性和支配原则 1. 同名成员的二义性 不同基类中有同名函数,使用基类名可避免这种二义: 基类与派生类同名函数 这种用基类名来控制成员访问的规则称为支配原则。 void C : : f ( ) { A : : f ( ); // B : : f ( ); } obj.A::f(); obj.B::f(); obj.g(); //隐含用C的g() obj.B:
文档评论(0)