通过取消引用 boost::shared_ptr 找不到派生类的方法

Lis*_*Ann 1 c++ inheritance pointers shared-ptr

我们有:

  • 基类Base
  • 派生类Derived

宣言:

class Derived : public Base
{
public:
  Derived();  // ctor
  ~Derived(); // dtor
  void MakeSomething();
private:
  // some private stuff
}
Run Code Online (Sandbox Code Playgroud)

现在我们去我们的主要。这工作正常:

// ...
Derived derived;
derived.MakeSomething();
// ...
Run Code Online (Sandbox Code Playgroud)

相反,这不起作用:

// ...
boost::shared_ptr< Base > derived(new Derived);
derived->MakeSomething();
// ...
Run Code Online (Sandbox Code Playgroud)

编译器说:

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

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

附加问题:

  • 我不能声明MakeSomething()virtual in Base,因为Base属于我可以继承的第三方库;
  • 我有其他需要我通过的类和方法boost::shared_ptr< Base >,我不能直接使用boost::shared_ptr< Derived >;
  • ...应该避免静态铸造吗?

R S*_*ahu 5

当您使用:

boost::shared_ptr< Base > derived = ...;
Run Code Online (Sandbox Code Playgroud)

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

Base* ptr = new Derived;
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 中定义virtual成员函数Base
  2. 创建指向Derived, 或
  3. dynamic_cast适当使用以获取指向Derived.