c++ 继承是否需要调用父类的构造函数
2024-01-08 17:42:00
今天遇到一个继承的问题。请回答下面问题:(已知 B 继承自 A)
- 子类是否需要调用父类的构造函数?必须还是可选?
先回答:
- 结论1 :强烈建议显示调用父类构造。因为有些父类可能会初始化一些成员变量,子类又不知道他初始化了哪些变量。
- 结论2:写父类的时候,别写一堆构造方法,不然容易漏。
展示一些野生程序员的父类,让我写子类的时候一堆坑。
例子1: 父类有成员未定义,建议你显示调用父类构造。
别人的父类:
class A
{
public:
A(int data = -1): value1(data) {}
int value1; // 正确初始的成员变量
char * value2;// 未初始化的成员变量,你一旦用了就报错
int value3;// 未初始化的成员变量,但有默认值0。
};
这种情况下,如果你的子类不调用,就会报错,而且是你的过错。
你的子类
class B : A
{
public:
// 不建议的构造
B(int data) : name(data) {
cout << *value2 << endl; // 报错,调用野指针
}
// 建议的构造
B(int data) : A(data), name(data) {
cout << *value2 << endl; // 也会报错,但责任不在你
}
int name;
};
其实就是父类和子类各自管好各自的成员。
例子2 :父类的构造别定义一堆
有人喜欢这样定义父类:
class CRectangleData
{
public:
CRectangleData();
CRectangleData(const double &dStartPosX, const double &dStartPosY, const double &dWidth, const double &dHeight);
private:
double m_dStartPosX; //起点横坐标
double m_dStartPosY; //起点纵坐标
double m_dWidth; //宽度
double m_dHeight; //高度
};
不好:
- 你有默认构造,子类就可以不用显示调用父类构造。我写子类的时候,到底调用你哪个父类构造呢?
- 哪些参数是必须的?哪些参数是可以设置的?哪些参数是默认的?没有体现出来。容易造成必须参数的未定义。
文章来源:https://blog.csdn.net/qq_43110298/article/details/135460443
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!