我们有:

  • 基类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();
    // ...
    

    编译器说:



    我知道还没有,实际上我想调用Derived的方法!我在继承和指针方面缺少什么?

    其他问题:
  • 我无法在MakeSomething()中声明虚拟的Base,因为Base属于我可以从其继承的第三方库。
  • 我还有其他类和方法需要我传递boost::shared_ptr< Base >,我不能直接使用boost::shared_ptr< Derived >
  • ...应避免静态铸造?
  • 最佳答案

    使用时:

    boost::shared_ptr< Base > derived = ...;
    

    您只能访问通过Basederived中声明的函数。最简单的类比是使用原始指针。
    Base* ptr = new Derived;
    

    即使ptr指向Derived,您也无法通过指针访问Derived的成员函数。

    您的选择是(我能想到的):
  • virtual
  • 中定义Base成员函数
  • 创建指向Derived
  • 的指针
  • 适当地使用dynamic_cast可获得指向Derived的指针。
  • 关于c++ - 通过解引用boost::shared_ptr找不到派生类的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32637278/

    10-14 09:34