C++11 smart pointers and polymorphism

2019-08-19 00:19发布

我重写使用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”成员

Answer 1:

但是,我怎么能与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 (它需要的基类包含一个虚拟功能发挥作用)如果对象可能具有不同类型的


Answer 2:

for(int i = 0; i < 10; i++) {
    auto bptr = make_shared<B>();
    v.push_back(bptr);
    bptr->b = 1;
};  


文章来源: C++11 smart pointers and polymorphism