派生 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
构造函数,例如,默认构造函数 Base
和 a
以及 b
;在更惯用的编写版本 Derived() : a(0), b(3) {}
中,它将默认构造 Base
并分别用 0 和 3 初始化 a
和 b
。
所以 Derived(...) : Base(foo), Derived(bar)
之类的东西正试图兼顾两者。它试图使用其他构造函数的一些初始化器,同时替换其他构造器。但这不是委派构造函数的设计目的。委托构造函数 使用 并且 添加到 另一个构造函数的 activity;它不会修改它。
一般的习惯用法是构造函数委托给更明确的构造函数。在这种情况下,听起来 a
和 b
默认为 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;
}
所以我想为我的派生 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
构造函数,例如,默认构造函数 Base
和 a
以及 b
;在更惯用的编写版本 Derived() : a(0), b(3) {}
中,它将默认构造 Base
并分别用 0 和 3 初始化 a
和 b
。
所以 Derived(...) : Base(foo), Derived(bar)
之类的东西正试图兼顾两者。它试图使用其他构造函数的一些初始化器,同时替换其他构造器。但这不是委派构造函数的设计目的。委托构造函数 使用 并且 添加到 另一个构造函数的 activity;它不会修改它。
一般的习惯用法是构造函数委托给更明确的构造函数。在这种情况下,听起来 a
和 b
默认为 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;
}