【问题标题】:C++11 smart pointers and polymorphismC++11 智能指针和多态性
【发布时间】:2013-04-02 10:48:38
【问题描述】:

我正在使用 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;
};  

编译器返回: 错误:“A 类”没有名为“b”的成员

【问题讨论】:

  • 你想做什么?听起来将 A 视为多态是一个错误的想法,因为您不会使用它。
  • 这与智能指针无关,您错误地使用了多态性。将 public b 成员替换为虚函数(可能是 get 和 set 函数)。
  • 我已经简化了课程。在它们的真实形式中,多态是有意义的。
  • 那么听起来简化的例子并不能代表真正的问题。

标签: c++ polymorphism smart-pointers


【解决方案1】:

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

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

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

std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);

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

  • 使用static_cast&lt;B*&gt;(v.back().get()) 如果你知道所有对象都有B类型
  • 如果对象可能有不同的类型,请使用虚函数或dynamic_cast(要求基类包含虚函数才能工作)

【讨论】:

    【解决方案2】:
    for(int i = 0; i < 10; i++) {
        auto bptr = make_shared<B>();
        v.push_back(bptr);
        bptr->b = 1;
    };  
    

    【讨论】:

    • 感谢您的回答。没错,但 Mike Seymour 的解释帮助我理解了原因。
    猜你喜欢
    • 2013-05-07
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多