1

我创建了一个名为的类A,它有一个虚拟方法do_something

class A {
  virtual int do_something() = 0;
}

B子类A

class B {
  virtual int do_something() {
    return 42;
  }
}

在我的主要功能的某个地方,我这样做了。

vector<A> arr;
arr.push_back(B());
int val = arr[0].do_something();

但是,我收到一个编译器错误,抱怨这do_something是一个纯虚函数。我相信这是因为我声明向量包含 type 的对象A,并且A是一个抽象类。因此,编译器不知道在类B中查看是否do_something已定义。

有没有解决的办法?我仍然可以存储不同类型的对象的向量(尽管声明了一个通用的虚函数,但具有一个通用的超类)?

4

2 回答 2

4

通过以这种方式声明向量:

vector<A> arr;

您正在尝试创建直接类型 A的对象向量。这不仅不允许您在B其中存储类型的对象(如果A不是抽象的,您会得到slicing,这是您当然不想要的),而且它也无法编译,因为不A存在 的直接实例。

您在这里想要的是存储指向A可能是智能指针)的指针:

#include <memory> // For smart pointer classes

vector<shared_ptr<A>> arr;
arr.push_back(make_shared<B>());
int val = arr[0]->do_something();

在这里,我决定使用shared_ptr,假设共享所有权,但如果对象的唯一所有者是容器arr,那unique_ptr将是一个更好的选择。

最后,如果你真的知道自己在做什么,并且准备好承担自动内存管理的麻烦,你可以使用原始指针,但我不鼓励你这样做(你必须确保你分配的delete每个对象都解除分配与new):

vector<A*> arr;
arr.push_back(new B());
int val = arr[0]->do_something();
于 2013-03-05T09:56:30.353 回答
2

有没有解决的办法?我仍然可以存储不同类型的对象的向量(尽管声明了一个通用的虚函数,但具有一个通用的超类)?

将智能指针与 std::vector 一起使用

std::vector<std::unique<A>> arr;
arr.emplace_back(new B());

或者

arr.emplace_back(std::make_shared<B>());
于 2013-03-05T09:55:46.577 回答