关于C ++多态性使用的问题

时间:2014-11-04 19:21:10

标签: c++ polymorphism

#include<iostream>

class base{
  public:
  virtual void run(){};
  protected:
  ~base(){std::cout<<"destructor for base"<<std::endl;};
};

class derived : public base {
   public:
   void run(){};
   ~derived(){std::cout<<"destructor for derived"<<std::endl;};
};

void get_type ( std::shared_ptr<base> b ){
    b.reset ( new derived );
    std::cout<<"end of get_type"<<std::endl;
}

int main(){
  std::shared_ptr<base> b;
  get_type ( b ) ;
  std::cout<<"out of get_type"<<std::endl;
  b->run();
}

它编译好了,但我得到了分段错误。我调查了发生了什么,输出是

get_type的结尾 析构函数派生 基础的析构函数 超出get_type 分段错误:11

进入get_type并分配其类型。但是,超出此功能范围,它会再次自动销毁该类型。然后,因为它找不到b-&gt; run(),所以它给出了seg错误。谁知道如何让它工作?我找不到类似的问题。对不起,如果可能重复。

1 个答案:

答案 0 :(得分:3)

您的get_type()函数会收到main函数中定义的shared_ptr的副本。然后它为此副本分配一个值并返回。离开get_type函数时,副本会正常释放其指针。然后在你的main函数中,初始的shared_ptr仍然是未分配的,显然在尝试取消引用它以调用run方法时会出现分段错误。

要使算法正常工作,您应该在get_type函数中询问对非共享引用的shared_ptr。

PS:正如其他人所指出的,你必须使你的基类的析构函数变为虚拟。