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();