通过取消引用 boost::shared_ptr 找不到派生的 class' 方法
Derived class' method not found via dereferencing boost::shared_ptr
我们有:
- 基础class
Base
;
- 派生 class
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
的方法!我在继承和指针方面缺少什么?
其他问题:
- 我无法在
Base
中声明 MakeSomething()
virtual,因为 Base
属于我可以继承的第三方库;
- 我还有其他 classes 和方法需要我通过
boost::shared_ptr< Base >
,我无法直接使用 boost::shared_ptr< Derived >
;
- ...应该避免静态转换?
当您使用时:
boost::shared_ptr< Base > derived = ...;
您只能访问在 Base
到 derived
中声明的函数。最简单的类比就是使用裸指针。
Base* ptr = new Derived;
即使ptr
指向一个Derived
,你也不能通过指针访问Derived
的成员函数。
你的选择是(我能想到的):
- 在
Base
、 中定义virtual
个成员函数
- 创建指向
Derived
或 的指针
- 适当地使用
dynamic_cast
以获得指向 Derived
的指针。
我们有:
- 基础class
Base
; - 派生 class
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
的方法!我在继承和指针方面缺少什么?
其他问题:
- 我无法在
Base
中声明MakeSomething()
virtual,因为Base
属于我可以继承的第三方库; - 我还有其他 classes 和方法需要我通过
boost::shared_ptr< Base >
,我无法直接使用boost::shared_ptr< Derived >
; - ...应该避免静态转换?
当您使用时:
boost::shared_ptr< Base > derived = ...;
您只能访问在 Base
到 derived
中声明的函数。最简单的类比就是使用裸指针。
Base* ptr = new Derived;
即使ptr
指向一个Derived
,你也不能通过指针访问Derived
的成员函数。
你的选择是(我能想到的):
- 在
Base
、 中定义 - 创建指向
Derived
或 的指针
- 适当地使用
dynamic_cast
以获得指向Derived
的指针。
virtual
个成员函数