似乎只能通过引用或者指针进行动态多态。。。蛋疼的语法
#include <iostream> #include <vector> #include <memory> using namespace std; class A { public: virtual void init() = 0; }; class B : public A { public: void init() { cout << "B init" << endl; } }; class C :public B { public: void print() { cout << "C -> B" << endl; } void init() { cout << "C init" << endl; } }; class D : public A { private: int wow; public: D() { wow = 0; } D(int a) :wow(a) {} void init() { cout << "D init" << endl; } void print() { cout << "D -> A" << wow << endl; } }; int main() { vector<shared_ptr<A>> list; list.push_back(make_shared<C>()); list.push_back(make_shared<D>(1)); for (auto &item : list) { item->init(); } ((D*)list[1].get())->print(); return 0; }
这样就可以实现所有物体放在一个容器里。。。
但是缺点也是显而易见的,如果强制转换到了错误的类,后面使用的时候就会出问题。
所以不能这么粗暴的转换,有一表达式可以帮助我们:
dynamic_cast
#define PTR_CONVERT(shared_ptr, type) (dynamic_cast<type*>(shared_ptr.get()))
PTR_CONVERT(list[0], C)->print();
PTR_CONVERT(list[1], D)->print();