C++ 派生类';通过取消引用boost::shared\u ptr找不到方法

C++ 派生类';通过取消引用boost::shared\u ptr找不到方法,c++,pointers,inheritance,shared-ptr,C++,Pointers,Inheritance,Shared Ptr,我们有: 基类base 派生类派生类 声明: class Derived : public Base { public: Derived(); // ctor ~Derived(); // dtor void MakeSomething(); private: // some private stuff } 现在我们进入我们的主要课程。这很好: // ... Derived derived; derived.MakeSomething(); // ... 相反,这是行不

我们有:

  • 基类
    base
  • 派生类
    派生类
声明:

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();
// ...
/。。。
boost::shared_ptr派生(新派生);
派生->生成某物();
// ...
编译器说:

错误:类“Base”没有成员“MakeSomething”

我知道它没有,事实上我想调用
派生的
方法!继承和指针缺少什么

其他问题:

  • 我不能在
    Base
    中声明
    MakeSomething()
    虚拟,因为
    Base
    属于我可以继承的第三方库
  • 我还有其他类和方法需要我通过
    boost::shared\u ptr
    ,我不能直接使用
    boost::shared\u ptr
  • …应避免静态铸造吗
使用时:

boost::shared_ptr< Base > derived = ...;
即使
ptr
指向
派生的
,也不能通过指针访问
派生的
的成员函数

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

  • Base
    中定义
    virtual
    成员函数
  • 创建指向派生的
    的指针,或
  • 适当地使用
    dynamic\u cast
    获取指向
    派生的
    的指针
  • 使用时:

    boost::shared_ptr< Base > derived = ...;
    
    即使
    ptr
    指向
    派生的
    ,也不能通过指针访问
    派生的
    的成员函数

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

  • Base
    中定义
    virtual
    成员函数
  • 创建指向派生的
    的指针,或
  • 适当地使用
    dynamic\u cast
    获取指向
    派生的
    的指针

  • Base
    应声明
    virtualvoid MakeSomething()=0(还有一个虚拟析构函数)…所以使用
    boost::static\u pointer\u cast(派生)->MakeSomething()
    如果要调用
    派生的
    方法,请获取指向
    派生的
    的指针。。。。因此,只要从一开始就使用
    boost::shared_ptr
    ,并在需要
    boost::shared_ptr
    时传递它?@LisaAnn
    boost::shared_ptr
    可以隐式转换为
    boost::shared_ptr
    。您可以从一开始就使用前者类
    Base
    应该声明
    virtualvoid MakeSomething()=0(还有一个虚拟析构函数)…所以使用
    boost::static\u pointer\u cast(派生)->MakeSomething()
    如果要调用
    派生的
    方法,请获取指向
    派生的
    的指针。。。。因此,只要从一开始就使用
    boost::shared_ptr
    ,并在需要
    boost::shared_ptr
    时传递它?@LisaAnn
    boost::shared_ptr
    可以隐式转换为
    boost::shared_ptr
    。您可以从一开始就使用前者这就是为什么我们有纯虚拟函数和接口。在任何一本优秀的C++书籍中都有。我不知道虚拟函数和界面在我无法修改基类时能帮助我,在我的C++书籍中从来没有发现这样的例子适合初学者。抱歉,这就是为什么我们有纯虚拟函数和接口。在任何一本优秀的C++书籍中都有。我不知道虚拟函数和界面在我无法修改基类时能帮助我,在我的C++书籍中从来没有发现这样的例子适合初学者。很抱歉