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

Posted

技术标签:

【中文标题】通过取消引用 boost::shared_ptr 找不到派生类的方法【英文标题】:Derived class' method not found via dereferencing 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;。你可以从一开始就使用前者 【参考方案1】:

使用时:

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

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

Base* ptr = new Derived;

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

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

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

【讨论】:

这就是为什么我们有纯虚函数和接口。涵盖在任何优秀的 C++ 书籍中。 当我无法修改基类时,我不知道纯虚函数和接口如何帮助我,在我的 C++ 初学者书籍中从未找到过这样的案例。对不起。 啊,非常感谢你,我整个早上都在为此头疼。

以上是关于通过取消引用 boost::shared_ptr 找不到派生类的方法的主要内容,如果未能解决你的问题,请参考以下文章

boost---shared_ptr笔记

boost::shared_ptr与定制删除器

boost::shared_ptr

Boost智能指针——shared_ptr

C++ 智能指针性能

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?