C ++在初始化列表外显式调用父构造函数

时间:2017-11-12 03:14:48

标签: c++

因此,调用父类'构造函数的普通方法是在初始化列表中:

e.g。

#include <cstdio>

struct Parent {
  explicit Parent(int a) {
    printf("Parent -- int\n");
  }
};

struct Child : public Parent {
  explicit Child(int a) : Parent(1) {
    printf("Child -- int\n");
  }
};

int main(int argc, char **argv) {
  Child c = Child(10);
};

打印Parent -- int然后Child -- int

(Somewhat)忽略它是否是一个好主意,我想知道是否可以在构造函数的主体(在正在构造的对象上)显式调用父构造函数,在初始化列表之外。

2 个答案:

答案 0 :(得分:1)

不,不是你想要的方式,所以它构造了对象的父部分。

处理这种情况的常用方法是使用“init”或“construct”方法,然后可以从子构造函数调用该方法:

struct Parent {
    explicit Parent(int a) {
        Construct(a);
    }
protected:
    void Construct(int a) { printf("Parent -- int\n"); }
    Parent() {}
};

struct Child : public Parent {
    explicit Child(int a) {
        Parent::Construct(a);
        printf("Child -- int\n");
    }
};

int main(int argc, char **argv) {
    Child c = Child(10);
};

答案 1 :(得分:0)

嗯,你可以但它不会做同样的事情。

例如。

explicit Child(int) {
    Parent(1);
}

不会初始化对象的Parent部分。相反,它将创建一个Parent类型的新临时对象,然后该临时对象将立即被破坏。