gea*_*uch 2 c++ inheritance c++14
我正在尝试实现一个类,该类是由相同抽象基类的不同实现方式构成的。这是一个最小的示例:
struct Base {
virtual ~Base() {}
virtual void something() const = 0;
}
Run Code Online (Sandbox Code Playgroud)
从该基础派生出两个类(Derived1和Derived2):
class Derived1 : public Base {
public:
void something() const override {
std::cout << "derived 1" << std::endl;
}
};
class Derived2 : public Base {
public:
void something() const override {
std::cout << "derived 2" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
我想要做的是通过构造函数将这些类的实例传递给另一个类(集合)。我试图使用std :: initializer_list实现此目的:
class Collection {
public:
Collection(std::initializer_list<Base> args) {
for(auto& arg: args) {
arg.something();
}
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试像这样调用该构造函数时
Derived1 d1;
Derived2 d2;
Collection col({d1, d2});
Run Code Online (Sandbox Code Playgroud)
它不会编译。这是我收到的错误消息:
无法分配抽象类型“ Base”的对象,
因为以下虚拟函数在“ Base”中是纯净的:
“ virtual void Base :: something()const”
看起来需要构造抽象基类的实例,但是为什么呢?我希望它与在初始化列表类中被调用的复制构造函数有关,但是我没有收到任何指示这种情况的错误消息。我觉得我在这里缺少了难以置信的基本知识,我似乎找不到了……
看起来需要构造抽象基类的实例
不可以,您不能创建抽象基类的实例。而是创建派生类的实例,然后使用基类引用或指向该实例的指针。
您想做的事可比
Derived1 d1; // Ok, create subclass instance
Base b = d1; // Not ok, copies only the Base part of d1, discards the rest
Run Code Online (Sandbox Code Playgroud)
这称为对象切片。您可以改为
Base& b1 = d1; // Ok, reference to d1 doesn't copy/slice anything
Base *b2 = &d1; // Pointers are ok, too
Run Code Online (Sandbox Code Playgroud)
应用于您的方案,您可以将构造函数定义Collection为
Collection(std::initializer_list<const Base*> args) {
for(auto *arg: args) {
arg->something();
}
}
Run Code Online (Sandbox Code Playgroud)
并通过实例化它
Collection col({&d1, &d2});
Run Code Online (Sandbox Code Playgroud)