几行程序,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;}