首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

几行程序,delete父类指针,导致崩溃,为什么?解决方案

2012-03-19 
几行程序,delete父类指针,导致崩溃,为什么?我用VC2005新建一个控制台工程,什么编译选项也没有改:C/C++ cod

几行程序,delete父类指针,导致崩溃,为什么?
我用VC2005新建一个控制台工程,什么编译选项也没有改:

C/C++ code
class father{    int i;public:    void f(){printf("father\n");}    virtual ~father(){}//我已经把父类的dtor指定为虚函数了呀};class child{public:    virtual void f(){printf("child\n");}};    int _tmain(int argc, _TCHAR* argv[]){    father* pf=(father*)(new child);    child* pc=dynamic_cast<child*>(pf);//如果我想关掉/GR,VC2005/2010用什么编译选项?    delete pf;//导致运行时错误,为什么?    return 0;}

网上说,vc2005默认是打开rtti生成的。这个编译选项在vc6里面是/GR,vc2005/2010下面叫什么? 我在工程属性-->命令行下面没有看到有叫做/GR的选项。

我的父类里面,析构函数已经声明为了virtual。我发现我的程序是在delete pf这一行奔溃的。去掉这一行就没有事了。
为什么呢?

[解决办法]
你定义子类的时候没有使用继承,class child:public father{}
[解决办法]
额···
你想用继承的吧···
然后通过虚函数实现动态链接?
[解决办法]
继承到哪去了? class child:public father
[解决办法]
VC里析构方法有一个隐含参数,virtual void f(int){printf("child\n");} 就成了。

前提是你的确想伪造一个析构方法。

run-time type在code generation里设置
[解决办法]
C/C++ code
class father{    int i;public:    void f(){printf("father\n");}    virtual ~father(){}//我已经把父类的dtor指定为虚函数了呀};class child:public father{public:    virtual void f(){printf("child\n");}};int _tmain(int argc, _TCHAR* argv[]){    father* pf=(father*)(new child);    child* pc=dynamic_cast<child*>(pf);//如果我想关掉/GR,VC2005/2010用什么编译选项?    delete pf;//导致运行时错误,为什么?    return 0;} 

热点排行