- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[理化生]第七章继承与派生
当派生类与基类中有同名成员时: 若未显式指定类名,则通过派生类对象使用的是派生类中的同名成员。 如果派生类中声明了与基类成员函数同名的新函数,即使函数的参数表不同,从基类继承的同名函数的所有重载形式也都会被隐藏。 如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名限定。 #include iostream using namecpace std; class B1 //声明基类B1 { public: //外部接口 int nV; void fun() {coutMember of B1endl;} }; class B2 //声明基类B2 { public: //外部接口 int nV; void fun(){coutMember of B2endl;} }; 在多继承时,基类之间出现同名成员时,将出现访问时的二义性(不确定性)——用类名限定,或同名隐藏规则来解决。 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。 派生类C的对象的存储结构示意图: 虚基类的派生类对象存储结构示意图: 例 虚基类举例 虚基类及其派生类构造函数 * * *************************************************2008/04/16 构造函数的执行顺序 1. 调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2. 对成员对象进行初始化,初始化顺序按照它们在类中声明的顺序。 3.执行派生类的构造函数体中的内容。 例 派生类构造函数举例 #include iostream using namespace std; class Base1 { //基类Base1,构造函数有参数 public: Base1(int i) { cout Constructing Base1 i endl; } }; class Base2 { //基类Base2,构造函数有参数 public: Base2(int j) { cout Constructing Base2 j endl; } }; class Base3 { //基类Base3,构造函数无参数 public: Base3() { cout Constructing Base3 * endl; } }; class Derived: public Base2, public Base1, public Base3 { //派生新类Derived,注意基类名的顺序 public: //派生类的公有成员 Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b) { } //注意基类名的个数与顺序,//注意成员对象名的个数与顺序 private: //派生类的私有成员对象 Base1 member1; Base2 member2; Base3 member3; }; int main() { Derived obj(1, 2, 3, 4); return 0; } 运行结果: constructing Base2 2 constructing Base1 1 constructing Base3 * constructing Base1 3 constructing Base2 4 constructing Base3 * 拷贝构造函数 若建立派生类对象时没有编写拷贝构造函数,编译器会生成一个隐含的拷贝构造函数,该函数先调用基类的拷贝构造函数,再为派生类新增的成员对象执行拷贝。 若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数。 例如: C::C(C c1): B(c1) {…} 继承时的析构函数 析构函数也不被继承,派生类自行声明 声明方法与一般(无继承关系时)类的析构函数相同。 不需要显式地调用基类的析构函数,系统会自动隐式调用。 析构函数的调用次序与构造函数相反。 例 派生类析构函数举例 #include iostream using namespace std; class Base1 { //基类Base1,构造函数有参数 public: Base1(int i) { cout Constructing Base1 i endl; } ~Base1() { cout Destructing Base1 endl; } }; class Base2 { //基类Base2,构造函数有参数 public: Base2(int j) { cout
文档评论(0)