C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 继承的概念 基类和派生类 派生类的构造和析构 同名覆盖与重载 多继承 同名覆盖与重载 转换与继承 在主函数中增加调试信息 C++语言程序设计
基本知识 a C++语言程序设计
8.3派生类的构造和析构 基类的构造函数和析构函数不能被派生类所继承; 派生类一般需要定义自己的构造函数和析构函数; 派生类的构造及析构函数通常会受到基类构造及析构函数的影响。 基类只有无参数构造函数 在基类具有无参构造函数,派生类又没有定义构造函数的时候,系统会自动调用基类的无参构造函数来构造派生类对象中的基类成分。 基类的构造函数一般被声明为public访问控制方式。若基类提供了一些构造函数,并且只希望由派生类使用这些构造函数,那么就需要在基类中将这样的特殊构造函数定义为 protected。 C++语言程序设计
8.3派生类的构造和析构 派生类的构造函数 派生类构造函数的形式如下。 C++语言程序设计 派生类的构造函数要初始化本类的数据成员,还要调用基类的构造函数,并为基类构造函数传递参数,完成派生类中基类成分的初始化。 派生类构造函数的形式如下。 派生类名::派生类名(基类所需的形参,本类成员所需的形参): 基类1(基类参数表1),基类2(基类参数表2),…,基类n(基类参数表n) { 本类基本类型数据成员初始化; } 初始化列表 C++语言程序设计
例8-3 单继承派生类构造函数 //TShape03.cpp #include "TShape03.h" //TShape03.h #include <iostream> TShape::TShape(uint x, uint y){ _x = x; _y = y; _RED = 0; _GREEN = 0; _BLUE = 0; } TShape::~TShape(){ cout<<"TShape destructed"<<endl; void TShape::Draw(){ cout<<"This is TShape::Draw()"<<endl; void TShape::getXY(uint& x, uint& y){ x = _x; y = _y; void TShape::getRGB(uchar& R, uchar& G, uchar& B){ R = _RED; G = _GREEN; B = _BLUE; //TShape03.h typedef unsigned int uint; typedef unsigned char uchar; class TShape{ private: uint _x, _y; //几何形状的位置 protected: /*声明几何形状的颜色。允许TShape的派生类直接访问这些颜色属性,而不允许在类外通过类的对象直接访问这些属性 */ uchar _RED, _GREEN, _BLUE; public: TShape(uint x, uint y); void getXY(uint& x, uint& y); void setXY(uint x, uint y); void Draw(); void getRGB(uchar& R, uchar& G, uchar& B); void setRGB(uchar R, uchar G, uchar B); };
class TEllipse: public TShape { protected: uint _longR, _shortR; //TEllipse03.h #include "TShape03.h" class TEllipse: public TShape { protected: uint _longR, _shortR; public: TEllipse(uint longR, uint shortR, uint x, uint y); ~TEllipse(); void Draw(); void getR(uint& longR, uint& shortR); void setR(uint longR, uint shortR); }; _longR = longR; _shortR = shortR; //在派生类构造函数中初始化基类保护成员 _RED = 0x00; _GREEN = 0x00; _BLUE = 0x00; } TEllipse::~TEllipse(){ void TEllipse::Draw(){ uint x, y; getXY(x, y); //调用基类函数获取椭圆的圆心坐标 std::cout<<"Draw an ellipse with color("; std::cout<<static_cast<uint>(_RED) <<"," <<static_cast<uint>(_GREEN)<<"," <<static_cast<uint>(_BLUE) <<") at point("; // cout<<_x<<“,”<<_y<<“)”<<endl; //错误!在派生类中不能访 问基类私有成员 cout<< x<<","<< y<<")"<<endl; //TEllipse03.cpp #include "TEllipse03.h" #include <iostream> TEllipse::TEllipse(uint longR, uint shortR, uint x, uint y):TShape(x,y){
8.3派生类的构造和析构 派生类不能继承基类的析构函数,需要自己定义析构函数,以便在派生类对象消亡之前进行必要的清理工作。 派生类的析构函数只负责清理它新定义的成员,一般来说,只清理位于堆区的成员。 如果没有特殊指针数据成员需要清理,可以使用由系统提供的默认析构函数。 当派生类对象消亡时,系统调用析构函数的顺序与建立派生类对象时调用构造函数的顺序正好相反,即先调用派生类的析构函数,再调用基类的析构函数。 C++语言程序设计