gpt4 book ai didi

c++ - 关于C++多态用法的问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:30 25 4
gpt4 key购买 nike

#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:正如其他人所指出的,您必须将基类的析构函数设为虚拟。

关于c++ - 关于C++多态用法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26743265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com