将工作委派给超类的构造函数[重复]

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(),这样我就不必在两个构造函数中设置xy

【问题讨论】:

查看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()前添加空格... 请点赞另一个,而不是这个,下一个答案比我的提供更多更好的信息。

以上是关于将工作委派给超类的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

什么时候需要显式调用超类构造函数?

为啥总是调用超类构造函数[重复]

通过生成构造函数将超类注入原始对象

通过生成构造函数将超类注入原始对象

有没有在 C++ 中不调用超类的构造函数的时候?

为啥在声明子类的对象时会调用超类的构造函数? (爪哇)