gpt4 book ai didi

C++ - 无法将派生类型作为基类型列表传递给构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:34:55 26 4
gpt4 key购买 nike

我正在尝试实现一个类,该类由同一抽象基类的不同数量的不同实现构造而成。这是一个最小的例子:

struct Base {
virtual ~Base() {}
virtual void something() const = 0;
}

有两个类(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;
}
};

我想做的是通过构造函数将这些类的实例传递给另一个类(Collection)。我尝试使用 std::initializer_list 实现此目的:

class Collection {
public:
Collection(std::initializer_list<Base> args) {
for(auto& arg: args) {
arg.something();
}
}
};

当我尝试像这样调用该构造函数时

Derived1 d1;
Derived2 d2;
Collection col({d1, d2});

它不编译。这是我收到的错误消息:

cannot allocate an object of abstract type 'Base'
because the following virtual functions are pure within 'Base':
'virtual void Base::something() const'

看起来需要构造一个抽象基类的实例,但是为什么呢?我希望它与在初始化列表类中调用的复制构造函数有关,但我没有收到任何错误指示情况。我觉得我在这里遗漏了一些非常基本的东西,我似乎找不到它......

最佳答案

It looks like it needs to construct an instance of the abstract base class

不,您不能创建抽象基类的实例。相反,您创建派生类的实例,然后使用基类引用或指向该实例的指针。

你正在尝试做的是可比的

Derived1 d1; // Ok, create subclass instance
Base b = d1; // Not ok, copies only the Base part of d1, discards the rest

这称为对象切片。您可以改为使用

Base& b1 = d1; // Ok, reference to d1 doesn't copy/slice anything
Base *b2 = &d1; // Pointers are ok, too

适用于您的场景,您可以将 Collection 的构造函数定义为

Collection(std::initializer_list<const Base*> args) {
for(auto *arg: args) {
arg->something();
}
}

并通过实例化它

Collection col({&d1, &d2});

关于C++ - 无法将派生类型作为基类型列表传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54999429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com