我们有:
- 基类
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
的成员函数。
你的选择是(我能想到的):
- 在
Base
中定义virtual
成员函数, - 创建指向
Derived
的指针,或者 - 适本地使用
dynamic_cast
来获取指向Derived
的指针。
关于c++ - 通过取消引用 boost::shared_ptr 找不到派生类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637278/