How do I implement abstract classes in C++ while allowing for subclass method calls?
我创建了一个名为
1 2 3 | class A { virtual int do_something() = 0; } |
1 2 3 4 5 | class B { virtual int do_something() { return 42; } } |
在我的主要功能中的某个地方,我这样做。
1 2 3 | vector<A> arr; arr.push_back(B()); int val = arr[0].do_something(); |
但是,我得到一个编译器错误,它抱怨
有办法解决这个问题吗?我还可以存储不同类型的对象的向量吗(尽管它声明了一个公共的虚函数,但有一个公共的超类)?
通过这样声明向量:
1 | vector<A> arr; |
您试图创建直接类型为
这里您需要存储指向
1 2 3 4 5 | #include <memory> // For smart pointer classes vector<shared_ptr<A>> arr; arr.push_back(make_shared()); int val = arr[0]->do_something(); |
在这里,我决定使用
最后,如果你真的知道你在做什么,并且你已经准备好忍受自动内存管理的麻烦,你可以使用原始指针,但是我不鼓励你这样做(你必须确保你处理
1 2 3 | vector<A*> arr; arr.push_back(new B()); int val = arr[0]->do_something(); |
Is there a way around this? Can I still store a vector of objects of different types (with a common superclass though that declares a common virtual function)?
将智能指针与std::vector一起使用
1 2 | std::vector<std::unique<A>> arr; arr.emplace_back(new B()); |
或
1 | arr.emplace_back(std::make_shared()); |