派生 class 的复制构造函数与基本 class 参数的排序

Sort of copy constructor of derived class with base class parameter

所以我想为我的派生 class 提供一个构造函数,我给它一个我的基 class 的实例,这样我的基 class 就用输入参数初始化,并且我的派生 class 遵循默认构造函数。 我想到了这个(MWE):

class Derived : public Base {
Derived(){a = 0; b=3;};
Derived(Base * base): Base(*base),Derived(){};
int a;
int b;
}

但这给了我错误 error: constructor delegation follows mem-initializer for 'Base'

那么我应该怎么做呢?我知道一种可行的方法,但我想问是否有更好的方法,使我在默认构造函数和另一个构造函数中没有相同的代码。

所以我知道这行得通:

class Derived : public Base {
Derived(){a = 0; b=3;};
Derived(Base * base): Base(*base){a = 0; b=3;};
int a;
int b;
}

构造函数定义的一件事是如何初始化成员和基类。 All 非委托构造函数显式或隐式地为 all 成员和基类定义初始值设定项。您的零参数 Derived 构造函数,例如,默认构造函数 Basea 以及 b;在更惯用的编写版本 Derived() : a(0), b(3) {} 中,它将默认构造 Base 并分别用 0 和 3 初始化 ab

所以 Derived(...) : Base(foo), Derived(bar) 之类的东西正试图兼顾两者。它试图使用其他构造函数的一些初始化器,同时替换其他构造器。但这不是委派构造函数的设计目的。委托构造函数 使用 并且 添加到 另一个构造函数的 activity;它不会修改它。

一般的习惯用法是构造函数委托给更明确的构造函数。在这种情况下,听起来 ab 默认为 0 和 3 通常是通过委托给直接设置它们的构造函数来完成的。这取决于您试图通过接受指向基 class 的指针来完成什么。这很奇怪,可能不太好。

最后,我要说的是,虽然委托构造函数不能通过委托构造函数进行修改,但默认成员初始值设定项 可以被显式初始值设定项替换。如果您只是在 class 定义中初始化 int a=0, b=3,则每个(非委托)构造函数都可以决定是保留这些默认值还是替换其中的一些。

事情是这样的,Derived(...):Derived(){};调用默认 Base 构造函数。因此,向 Base 的构造函数添加额外的调用会使编译器感到困惑——它怎么知道你想要什么?

如果想避免代码重复,可以这样写:

     class Derived : public Base 
     {
        public:
        Derived()=default;
        Derived(Base * base): Base(*base){};
        int a = 0;
        int b = 3;
      }