将工作委托给超类的构造函数

时间:2012-12-29 11:49:52

标签: c++ constructor polymorphism

  

可能重复:
  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

2 个答案:

答案 0 :(得分:5)

使用构造函数的成员初始化列表:

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) { }
};

您不需要显式调用基类' default 构造函数,它会在派生类'构造函数运行之前自动调用。

另一方面,如果你想用参数构造基类(如果存在这样的构造函数),那么你需要来调用它:

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
};

只有当您不希望使用默认值初始化基本成员时才显式调用它。

希望有所帮助。

答案 1 :(得分:1)

如果你愿意,可以在member initialize list中调用基础构造函数,实际上会自动调用Super()构造函数。

别忘了让超级析构函数虚拟化。

class Super {
public:
    int x, y;
    Super() : x(100),y(100) {}
    virtual ~Super(){}
};

如果允许通过指向Super的指针进行删除,那么Super析构函数必须是公共的和虚拟的。