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

标签 c++ pointers inheritance shared-ptr

我们有:

  • 基类 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();
// ...

编译器说:

Error: class "Base" has no member "MakeSomething"

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

其他问题:

  • 我不能申报MakeSomething()虚拟 Base ,因为 Base属于我可以继承的第三方库;
  • 我还有其他类和方法需要通过 boost::shared_ptr< Base > ,我不能直接使用 boost::shared_ptr< Derived > ;
  • ...应避免静态转换?

最佳答案

当您使用时:

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

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

Base* ptr = new Derived;

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

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

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

关于c++ - 通过取消引用 boost::shared_ptr 找不到派生类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637278/

相关文章:

c++ - 如何在常量求值表达式中获得编译时错误?

c - 如何处理从复杂输入(字符串)中提取 double 类型的数字

c++ - 继承依赖的 typedef 而不使用 struct

c++ - 如何正确构建相互引用的类? (C++)

java - Java 8 中的接口(interface)

c++ - 在每次迭代中以不同的顺序循环遍历项目列表

c++ - 删除对象时双重释放或损坏(另一个......)

c++ - 为什么程序没有以正确的方式执行?

c - 为什么当 N 越界时 &a[N] 不调用 UB?

c++ - 在 C++ 中使用 `{}` 聚合初始化 union