对C++多态性用法的疑问

Quesition on C++ polymorphism usage

本文关键字:用法 C++ 多态性      更新时间:2023-10-16
#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->run((,它给出了 seg 错误。有人知道如何让它工作吗?我找不到类似的问题。抱歉,如果可能重复。

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

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

PS:正如其他人指出的那样,您必须使基类的析构函数成为虚拟的。