默认基类初始值设定项

时间:2018-04-11 15:33:46

标签: c++ constructor initialization

有没有办法在类声明中为基类指定默认初始值设定项?

说我有:

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

有没有办法指定与default member initializer类似的默认基本初始化程序

或许像:

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

我考虑过使用委托构造函数,但是如果有多个base和不同的构造函数,其中相同的base并不总是默认初始化,那么委托构造函数将无助于简化与构造函数member initializer list相同的方式为成员做。

1 个答案:

答案 0 :(得分:3)

  

有没有办法在类声明中为基类指定默认初始值设定项?

要在类声明本身中执行此操作,需要使基类具有模板参数,例如:

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>是不同的类类型,您将无法传递AntSpiderAnimal个对象预计(不使用更多模板)。

话虽如此,假设您确实希望Animal成为一个独特的类,您可以从中派生并传递,我建议您可以为int构造函数提供默认值并省略{{1}构造函数(是的,你可以在这个例子中使用委托构造函数),例如:

= default