继承中对派生类构造函数的理解
继承是C++中一一个非常重要的机制,通过继承,使得多态成为了可能
以下是本人对继承中派生类的构造函数的理解
class Shape
{
public:
Shape(const char* color) { strcpy_s(s_color, strlen(color) + 1, color); }
char* GetColor() { return s_color; }
private:
char s_color[20];
};
定义了一个基类Shape,Shape包含:
带参数的构造函数
一个获取颜色的函数
一个私有成员变量:颜色
注:由于strcpy在VS2019中会直接报错为“unsafe”,所以使用了strcpy_s()
class Circle :public Shape
{
public:
> Circle(float x, float y, float r, const char* color) :Shape(color)
//调用派生类的构造函数
{
c_x = x;
c_y = y;
c_r = r;
}
float GetRadius() { return c_r; }
float GetX() { return c_x; }
float GetY() { return c_y; }
private:
float c_x, c_y, c_r;
};
定义一个派生类Circle,公有继承于Shape类
Circle(float x, float y, float r, const char* color) :Shape(color)
这行代码表示了派生类显式的调用了基类的构造函数
我是这样理解的:
派生类在继承基类的时候,会完全继承基类的所有方法和属性(包括私有成员变量),而派生类继承基类的方式有:public、protected、private,无论以哪种方式继承,基类的私有成员都是不可访问(在派生类中)的,但是派生类在初始化自己的成员变量的时候,需要先初始化基类的成员变量,由于不可访问,所以必须调用基类的构造函数,对来自基类的成员变量进行初始化,所以,派生类的构造函数,需要先调用基类的构造函数。
注:由于基类不存在默认构造函数,所以派生类必须显式的调用基类的构造函数。
关于调用顺序:
由于派生类必须先初始化基类的数据成员,所以构造函数的调用顺序应该为:先调用基类的构造函数,再调用派生类的构造函数。
而关于析构函数,继承中,派生类的析构函数与基类的析构函数调用顺序相反:先调用派生类的析构函数,再调用基类的析构函数
本人萌新,初学C++,观点和理念不全面,浅谈个人看法,望各路大牛多多指点