C++ 11智能指针和多态

Med*_*ist 6 c++ polymorphism smart-pointers

我正在使用c ++ 11智能指针重写应用程序.

我有一个基类:

class A {};
Run Code Online (Sandbox Code Playgroud)

派生类:

class B : public A {
  public:
  int b;
};
Run Code Online (Sandbox Code Playgroud)

我有另一个类包含一个带有A或B对象的向量:

class C {
  public:
  vector<shared_ptr<A>> v;
};
Run Code Online (Sandbox Code Playgroud)

使用A(基类)对象构造C没有问题但是如何用B(派生类)对象填充它?

我正在尝试这个:

for(int i = 0; i < 10; i++) {
    v.push_back(make_shared<B>());
    v.back()->b = 1;
};  
Run Code Online (Sandbox Code Playgroud)

并且编译器返回:错误:'class A'没有名为'b'的成员

Mik*_*our 11

但是如何用B(派生类)对象填充它?

你正在填充(指向)B对象.但是,指针的静态类型是指基类A,因此您无法直接使用它们来访问派生类的任何成员.

在您的简单示例中,您可以简单地保持指向B并使用它:

std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);
Run Code Online (Sandbox Code Playgroud)

如果您无法访问原始指针,那么您将需要某种多态性:

  • 使用static_cast<B*>(v.back().get()) 如果你知道所有的对象都具有类型B
  • dynamic_cast如果对象可能具有不同的类型,则使用虚函数或(需要基类包含要运行的虚函数)


Hen*_*rik 5

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

  • 谢谢您的回答。这是正确的,但 Mike Seymour 的解释帮助我理解了原因。 (5认同)