11

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

我有一个基类:

class A {};

和一个派生类:

class B : public A {
  public:
  int b;
};

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

class C {
  public:
  vector<shared_ptr<A>> v;
};

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

我正在尝试这个:

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

编译器返回:error: 'class A' has no member named 'b'</p>

4

2 回答 2

17

但是如何用 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(需要基类包含虚函数才能工作)
于 2013-04-02T11:00:18.613 回答
5
for(int i = 0; i < 10; i++) {
    auto bptr = make_shared<B>();
    v.push_back(bptr);
    bptr->b = 1;
};  
于 2013-04-02T10:51:54.250 回答