我们有:
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();
// ...
编译说:
错误:班级&#34;基地&#34;没有会员&#34; MakeSomething&#34;
我知道它没有,事实上我想打电话给Derived
的方法!我对继承和指针缺少什么?
其他问题:
MakeSomething()
中声明Base
虚拟,因为Base
属于我可以继承的第三方库; boost::shared_ptr< Base >
,我不能直接使用boost::shared_ptr< Derived >
; 答案 0 :(得分:4)
使用时:
boost::shared_ptr< Base > derived = ...;
您只能访问Base
到derived
中声明的功能。最简单的比喻是使用原始指针。
Base* ptr = new Derived;
即使ptr
指向Derived
,您也无法通过指针访问Derived
的成员函数。
您的选择(我能想到):
virtual
,Base
个成员函数
Derived
或dynamic_cast
获取指向Derived
。