- 2
- 0
- 约 55页
- 2016-08-15 发布于重庆
- 举报
C第7章继承与派生
(续) void main() { D d1; D d2(1,2,3,10,20,30,40); } 调用类B的构造函数B() 调用类A的构造函数A() 调用类C的构造函数 调用类C的构造函数 调用类A的构造函数A() 调用类B的构造函数B() 调用类D的构造函数D() 调用类B的构造函数B(int) 调用类A的构造函数A(int,int) 调用类C的构造函数 调用类C的构造函数 调用类A的构造函数A(int,int) 调用类B的构造函数B(int) 调用类D的构造函数D(int,int,int,int,int,int,int) (续) 调用类D的析构函数 调用类B的析构函数 调用类A的析构函数 调用类C的析构函数 调用类C的析构函数 调用类A的析构函数 调用类B的析构函数 调用类D的析构函数 调用类B的析构函数 调用类A的析构函数 调用类C的析构函数 调用类C的析构函数 调用类A的析构函数 调用类B的析构函数 (1) 调用派生类析构函数。 (2) 调用派生类中新增对象成员的析构函数,顺序与它们在派生类中声明 的顺序相反。 (3) 调用基类的析构函数,调用顺序与声明派生类时基类在声明语句中出 现的顺序相反。 析构函数的执行顺序与构造函数正好相反。其顺序是: (续) 【 7.3.1 友元关系以及静态成员的继承】 7.3 其他特征的继承关系 1.友元关系 基类的友元不继承。即,如果基类有友元类或友元函数,则其派生类不因继承关系也有此友元类或友元函数。另一方面,如果基类是某类的友元,则这种友元关系是被继承的。即,被派生类继承过来的成员,如果原来是某类的友元,那么它作为派生类的成员仍然是某类的友元。 总之: (1)基类的友元不一定是派生类的友元; (2)基类的成员是某类的友元,则其作为派生类继承的成员仍是某类的友元。 【 7.3.1 友元关系以及静态成员的继承】 7.3 其他特征的继承关系 2.静态成员的继承 如果基类中被派生类继承的成员是静态成员,则其静态属性也随静态成员被继承过来。具体地说,如果基类的静态成员是公有的或是保护的,则它们被其派生类继承为派生类的静态成员。 即: (1)这些成员通常用“类名::成员名”方式引用或调用。 (2)这些成员无论有多少个对象被创建,都只有一个拷贝。它为基类和派生类的所有对象所共享。 【 7.3.2 与基类对象和派生类对象相关的赋值兼容性问题】 7.3 其他特征的继承关系 派生类对象间的赋值操作依据下面的原则: (1)如果派生类有自己的赋值运算符的重载定义,即按该重载函数处理。 (2)派生类未定义自己的赋值操作,而基类定义了赋值操作,则系统自动 定义派生类赋值操作,其中基类成员的赋值按基类的赋值操作进行。 (3)二者都未定义专门的赋值操作,系统自动定义缺省赋值操作(按位进行拷贝)。 另一方面,基类对象和派生类对象之间允许有下述的赋值关系( 允许将派生类对象“当作”基类对象来使用): (1)基类对象= 派生类对象; 允许这种赋值(在上一节中已经提到了这一特性),但只赋“共性成员”部分(注意,派生类对象除含有基类对象的成员外,通常还具有自己特有的成员以区别于其基类)。但反方向的下述赋值不被允许:派生类对象= 基类对象。 (2)指向基类对象的指针= 派生类对象的地址; 【 7.3.2 与基类对象和派生类对象相关的赋值兼容性问题】 7.3 其他特征的继承关系 注:通过指向基类型的指针可以直接访问基类成员部分,但访问非基类成员部分时,要经过指针类型的强制转换。 注意,下述赋值不允许: 指向派生类类型的指针= 基类对象的地址。 (3)基类的引用= 派生类对象; 允许进行!即派生类对象可以初始化基类的引用。 注:通过引用只可以访问基类成员部分(而不可访问非基类成员部分,因为不可将基类的引用强制转换为其派生类类型)。 注意,下述赋值不允许: 派生类的引用= 基类对象。 【 7.3.2 与基类对象和派生类对象相关的赋值兼容性问题】 7.3 其他特征的继承关系 #includeiostream.h class base { //基类base int a; public: base (int sa) {a=sa;} int geta(){return a;} }; class derived:public base { //派生类derived int b; public: derived(int sa, int sb):base(sa) {b=sb;} int getb(){return b;} }; void mai
原创力文档

文档评论(0)