通过取消引用 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< Base >
,我不能直接使用boost::shared_ptr< Derived >
;
...应该避免静态转换?
【问题讨论】:
ClassBase
应该声明 virtual void MakeSomething() = 0;
(以及一个虚拟析构函数)
...所以使用boost::static_pointer_cast<Derived>(derived)->MakeSomething();
如果你想调用一个Derived
方法,获取一个指向Derived
的指针。
...所以,从一开始就使用boost::shared_ptr<Derived>
,并在需要boost::shared_ptr<Base>
时传递它?
@LisaAnn boost::shared_ptr<Derived>
可隐式转换为 boost::shared_ptr<Base>
。你可以从一开始就使用前者
【参考方案1】:
使用时:
boost::shared_ptr< Base > derived = ...;
您只能访问在Base
到derived
中声明的函数。最简单的类比是使用原始指针。
Base* ptr = new Derived;
即使ptr
指向Derived
,您也不能通过指针访问Derived
的成员函数。
你的选择是(我能想到的):
-
在
Base
中定义virtual
成员函数,
创建指向Derived
的指针,或者
适当地使用dynamic_cast
来获取指向Derived
的指针。
【讨论】:
这就是为什么我们有纯虚函数和接口。涵盖在任何优秀的 C++ 书籍中。 当我无法修改基类时,我不知道纯虚函数和接口如何帮助我,在我的 C++ 初学者书籍中从未找到过这样的案例。对不起。 啊,非常感谢你,我整个早上都在为此头疼。以上是关于通过取消引用 boost::shared_ptr 找不到派生类的方法的主要内容,如果未能解决你的问题,请参考以下文章