我重写使用C ++ 11个智能指针的应用程序。
我有一个基类:
class A {};
和派生类:
class B : public A {
public:
int b;
};
我有包含与A或B的对象的载体另一个类:
class C {
public:
vector<shared_ptr<A>> v;
};
我没有问题,构建下与A(基类)的对象,但我怎么能与B(派生类)对象补吗?
我想这样的:
for(int i = 0; i < 10; i++) {
v.push_back(make_shared<B>());
v.back()->b = 1;
};
而编译器返回:错误:“A级”没有名为“B”成员
但是,我怎么能与B(派生类)对象补吗?
您正在使用(指针)加油吧B
对象。 然而,指针静态类型指基类的A
,所以你不能直接使用这些访问派生类中的任何成员。
在您简单的例子,你可以简单地保持一个指针保持到B
和使用:
std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);
如果您没有访问原始指针,那么你将需要某种形式的多态性:
- 使用
static_cast<B*>(v.back().get())
,如果你知道所有的对象都具有类型B
- 使用虚拟函数或
dynamic_cast
(它需要的基类包含一个虚拟功能发挥作用)如果对象可能具有不同类型的
for(int i = 0; i < 10; i++) {
auto bptr = make_shared<B>();
v.push_back(bptr);
bptr->b = 1;
};