C++ 如何在C++;同时允许子类方法调用?

C++ 如何在C++;同时允许子类方法调用?,c++,C++,我创建了一个名为a的类,它有一个虚拟方法do\u 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(); 向量arr

我创建了一个名为
a
的类,它有一个虚拟方法
do\u 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();
向量arr;
arr.push_back(B());
int val=arr[0]。做点什么();
然而,我收到一个编译器错误,抱怨
dou\u something
是一个纯虚拟函数。我相信这是因为我声明向量包含
A
类型的对象,而
A
是一个抽象类。因此,编译器不知道在类
B
中查看
do\u something
是否已定义

有办法解决这个问题吗?我仍然可以存储不同类型对象的向量(尽管有一个公共超类声明一个公共虚函数)

有办法解决这个问题吗?我仍然可以存储不同类型对象的向量(尽管有一个公共超类声明一个公共虚函数)

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

std::vector<std::unique<A>> arr;
arr.emplace_back(new B());
std::向量arr;
返回(新的B());

arr.emplace_back(std::make_shared());
有办法解决这个问题吗?我仍然可以存储不同类型对象的向量(尽管有一个公共超类声明一个公共虚函数)

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

std::vector<std::unique<A>> arr;
arr.emplace_back(new B());
std::向量arr;
返回(新的B());

arr.emplace_back(std::make_shared());

通过以下方式声明向量:

vector<A> arr;
在这里,我决定使用
shared\u ptr
,假设共享所有权,但是如果对象的唯一所有者是容器
arr
unique\u ptr
将是一个更好的选择

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

向量arr;
arr.push_back(新B());
int val=arr[0]->do_something();

通过以下方式声明向量:

vector<A> arr;
在这里,我决定使用
shared\u ptr
,假设共享所有权,但是如果对象的唯一所有者是容器
arr
unique\u ptr
将是一个更好的选择

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

向量arr;
arr.push_back(新B());
int val=arr[0]->do_something();

类型切片。当你把
B
放入
vector
时,一条总线在它上面运行,直到它不再是
B
。如果您需要运行时多态性,请使用指针。实际上,编译器并不知道在类
B
中查找。向量包含
A
对象,因此
B
甚至不包含在其中。查找“对象切片”。键入切片。当你把
B
放入
vector
时,一条总线在它上面运行,直到它不再是
B
。如果您需要运行时多态性,请使用指针。实际上,编译器并不知道在类
B
中查找。向量包含
A
对象,因此
B
甚至不包含在其中。查找“对象切片”。
vector<A*> arr;
arr.push_back(new B());
int val = arr[0]->do_something();