看来只能通过指针的强制转换来实现我的目标。。。蛋疼的语法
#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; }
这样就可以实现所有物体放在一个容器里。。。但是用的时候。。。还要记着相应的类型,加以转换。。。
加个宏帮助转换
#define PTR_CONVERT(shared_ptr, type) ((type*)shared_ptr.get())
PTR_CONVERT(list[0], C)->print();PTR_CONVERT(list[1], D)->print();
时间: 2024-10-06 09:24:25