默认基类初始值设定项
Default base class initializer
有没有办法在类声明中为基类指定默认初始值设定项?
假设我有:
#include <string>
struct Animal {
Animal(int legs) : legs{legs} {}
Animal() = default;
int legs{4};
};
struct Ant : Animal {
Ant(int size) : Animal{6}, size{size} {}
Ant() : Animal{6} {}
Ant(std::string s) : Animal{6} {}
int size{0};
};
struct Spider : Animal {
Spider(int size) : Animal{8}, size{size} {}
Spider() : Animal{8} {}
Spider(std::string s) : Animal{8} {}
int size{0};
};
有没有办法指定类似于默认成员初始值设定项的默认基初始值设定项?
也许像这样:
#include <string>
struct Animal {
Animal(int legs) : legs{legs} {}
Animal() = default;
int legs{4};
};
struct Ant : Animal{6} {
Ant(int size) : size{size} {}
Ant() {}
Ant(std::string s) {}
int size{0};
};
struct Spider : Animal{8} {
Spider(int size) : size{size} {}
Spider() {}
Spider(std::string s) {}
int size{0};
};
我想过使用委托构造函数,但如果有多个基和不同的构造函数,其中相同的基并不总是默认初始化,那么委托构造函数将无助于简化,就像构造函数成员初始值设定项列表对成员所做的那样。
有没有办法在类声明中为基类指定默认初始值设定项?
要在类声明本身中执行此操作,需要使基类具有模板参数,例如:
template <size_t NumberOfLegs>
struct Animal {
Animal() = default;
int legs{NumberOfLegs};
};
struct Ant : Animal<6> {
Ant() = default;
Ant(int size) : size{size} {}
Ant(std::string s) {}
int size{0};
};
struct Spider : Animal<8> {
Spider() = default;
Spider(int size) : size{size} {}
Spider(std::string s) {}
int size{0};
};
但这意味着Animal<6>
和Animal<8>
是不同的类类型,您将无法在预期Animal
的地方传递Ant
和Spider
对象(也就是说,不使用更多模板(。
话虽如此,假设您实际上希望Animal
是一个可以从中派生和传递的独特类,我建议您为int
构造函数提供默认值并省略= default
构造函数(是的,您可以在此示例中使用委托构造函数(,例如:
struct Animal {
Animal(int legs = 4) : legs{legs} {}
int legs;
};
struct Ant : Animal {
Ant(int size = 0) : Animal{6}, size(size) {}
Ant(std::string s) : Ant(0) {}
int size;
};
struct Spider : Animal {
Spider(int size = 0) : Animal{8}, size{size} {}
Spider(std::string s) : Spider(0) {}
int size;
};
相关文章:
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 默认基类初始值设定项
- 派生类是否具有基类的默认构造函数
- 具有虚拟析构函数的基类子类中的默认析构函数
- 如何防止在基类初始化器中调用默认构造函数?
- C++具有默认参数的基类构造函数
- 在调用基类构造函数时声明默认构造函数
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 重载基类中的方法,默认为成员变量
- 默认赋值运算符有权访问基类的私有成员
- 为什么要删除基类的默认复制并移动ctor和赋值
- 正向声明要在基类中使用的派生类会导致缺少默认构造函数错误
- `使用`keyword表示基类中的默认行为
- 基类在派生类构造函数初始化列表时没有默认构造函数
- 尝试制作派生类,编译器需要抽象基的默认构造函数
- 警告:X的默认移动分配运算符将多次移动分配虚拟基类Y
- 虚拟继承是否强制基类默认为可构造的
- 为什么在虚拟基多重继承中只调用基类默认构造函数