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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。