今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员。
派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的
class Rectangle : public Shape {
public:
Rectangle () : id(1234), name("Rectangle")
{ // id: 父类Shape成员, name 子类Rectangle成员
}
};
本着严谨的负责态度,说出去的要保证是经过检验的。这里涉及到到一个基本的问题, 子类的参数初始化列表与父类构造函数哪个先执行?
教科书上已经给了我们答案: 派生类构造函数会默认调用基类的默认父类函数。
毫无疑问,应该是父类的构造函数先执行。那么参数初始化列表什么时候执行呢?
口说无凭,我们写个例子看看实际的执行情况。
#include <iostream>
#include <string>
using namespace std;
class Shape {
public:
Shape() {
cout<< "Shape strutured"<<endl;
}
private:
string id;
};
class Bound {
public:
Bound(int line) {
cout<<"Bound "<<line<<endl;
}
};
class Triangle : public Shape {
public:
Triangle() : version("1.0"),name("triagnle"),bd(4) {
cout<<"Triangnle"<<endl;
}
private:
string version;
string name;
Bound bd;
};
int main()
{
Triangle tg;
return 0;
}
Shape strutured
Bound 4
Triangnle
从执行结果上看正印证了上面的结论,基类的构造函数为先执行,参数初始化列表随后执行,但又优先于派生类的构造函数内代码先执行。
博客探讨了C++中派生类构造函数的参数初始化列表和基类构造函数的执行顺序问题。根据教科书,派生类构造函数会先调用基类的默认构造函数,然后执行参数初始化列表,最后是派生类构造函数内的代码。通过实例验证了这一顺序,显示基类构造函数先于参数初始化列表执行,而初始化列表又在派生类构造函数体之前执行。

1793

被折叠的 条评论
为什么被折叠?



