将工作委派给超类的构造函数[重复]
Posted
技术标签:
【中文标题】将工作委派给超类的构造函数[重复]【英文标题】:Delegating work to the superclass' constructor [duplicate] 【发布时间】:2012-12-14 10:01:43 【问题描述】:可能重复:C++ superclass constructor calling rules
您如何将工作委托给超类的构造函数?比如
class Super
public:
int x, y;
Super() x = y = 100;
;
class Sub : public Super
public:
float z;
Sub() z = 2.5;
;
如何让Sub::Sub()
调用Super::Super()
,这样我就不必在两个构造函数中设置x
和y
?
【问题讨论】:
查看this question了解一般超/子类礼仪。 【参考方案1】:使用构造函数的成员初始化列表:
class Super
public:
int x, y;
Super() : x(100), y(100) // initialize x and y to 100
// that was assignment, not initialization
// x = y = 100;
;
class Sub : public Super
public:
float z;
Sub() : z(2.5)
;
您不需要显式调用基类的默认构造函数,它会在派生类的构造函数运行之前自动调用。
另一方面,如果您希望使用参数构造基类(如果存在这样的构造函数),那么您需要调用它:
class Super
public:
int x, y;
explicit Super(int i) : x(i), y(i) // initialize x and y to i
;
class Sub : public Super
public:
float z;
Sub() : Super(100), z(2.5)
;
此外,任何可以在没有参数的情况下调用的构造函数也是默认构造函数。所以你可以这样做:
class Super
public:
int x, y;
explicit Super(int i = 100) : x(i), y(i)
;
class Sub : public Super
public:
float z;
Sub() : Super(42), z(2.5)
;
class AnotherSub : public
public:
AnotherSub()
// this constructor could be even left out completely, the compiler generated
// one will do the right thing
;
并且仅当您不希望使用默认值初始化基成员时才显式调用它。
希望对您有所帮助。
【讨论】:
【参考方案2】:如果你想调用member initialize list
中的基础构造函数,实际上Super()构造函数会被自动调用。
不要忘记将 Super 析构函数设为虚拟。
class Super
public:
int x, y;
Super() : x(100),y(100)
virtual ~Super()
;
如果应该允许通过指向 Super 的指针进行删除,那么 Super 析构函数必须是公共的和虚拟的。
【讨论】:
Super() 构造函数被自动调用(无需显式调用)。仅当 Super 类析构函数将成为多态基类型时才将其设为虚拟(因为没有虚拟成员,这不一定是真的)。 请注意,您不需要调用基本构造函数,因为在这种情况下编译器会隐式调用它。您只需要显式列出 non-default 构造函数(以传递参数)。 Loki 也是正确的,因为您并不总是希望使析构函数具有多态性。 请在: Super()
前添加空格...
请点赞另一个,而不是这个,下一个答案比我的提供更多更好的信息。以上是关于将工作委派给超类的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章