【问题标题】:Derived class' method not found via dereferencing boost::shared_ptr通过取消引用 boost::shared_ptr 找不到派生类的方法
【发布时间】:2015-09-17 18:14:38
【问题描述】:

我们有:

  • 基类Base;
  • 派生类Derived

声明:

class Derived : public Base
{
public:
  Derived();  // ctor
  ~Derived(); // dtor
  void MakeSomething();
private:
  // some private stuff
}

现在我们进入我们的主要部分。这工作正常:

// ...
Derived derived;
derived.MakeSomething();
// ...

相反,这是行不通的:

// ...
boost::shared_ptr< Base > derived(new Derived);
derived->MakeSomething();
// ...

编译器说:

错误:类“Base”没有成员“MakeSomething”

我知道没有,其实我想调用Derived的方法!继承和指针缺少什么?

其他问题:

  • 我不能在Base 中声明MakeSomething() virtual,因为Base 属于我可以从中继承的第三方库;
  • 我还有其他类和方法需要我通过boost::shared_ptr&lt; Base &gt;,我不能直接使用boost::shared_ptr&lt; Derived &gt;
  • ...应该避免静态转换?

【问题讨论】:

  • Class Base 应该声明 virtual void MakeSomething() = 0;(以及一个虚拟析构函数)
  • ...所以使用boost::static_pointer_cast&lt;Derived&gt;(derived)-&gt;MakeSomething();
  • 如果你想调用一个Derived方法,获取一个指向Derived的指针。
  • ...所以,从一开始就使用boost::shared_ptr&lt;Derived&gt;,并在需要boost::shared_ptr&lt;Base&gt; 时传递它?
  • @LisaAnn boost::shared_ptr&lt;Derived&gt; 可隐式转换为 boost::shared_ptr&lt;Base&gt;。你可以从一开始就使用前者

标签: c++ pointers inheritance shared-ptr


【解决方案1】:

使用时:

boost::shared_ptr< Base > derived = ...;

您只能访问在Basederived 中声明的函数。最简单的类比是使用原始指针。

Base* ptr = new Derived;

即使ptr 指向Derived,您也不能通过指针访问Derived 的成员函数。

你的选择是(我能想到的):

  1. Base中定义virtual成员函数,
  2. 创建指向Derived 的指针,或者
  3. 适当地使用dynamic_cast 来获取指向Derived 的指针。

【讨论】:

  • 这就是为什么我们有纯虚函数和接口。涵盖在任何优秀的 C++ 书籍中。
  • 当我无法修改基类时,我不知道纯虚函数和接口如何帮助我,在我的 C++ 初学者书籍中从未找到过这样的案例。对不起。
  • 啊,非常感谢你,我整个早上都在为此头疼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2021-06-15
  • 1970-01-01
  • 2017-01-03
  • 2016-02-24
  • 2016-09-26
相关资源
最近更新 更多