鱼C论坛

 找回密码
 立即注册
查看: 4869|回复: 7

关于C++的virtual继承

[复制链接]
发表于 2013-7-24 23:11:05 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 565123 于 2013-7-25 00:18 编辑

为什么virtual继承不能delete,我调试到delete时,就有这么一个错误 Pic1.png Pic2.png
我试过VC6和VS2013都有这个问题,这是没发现的bug吗?还是根本就是错误的写法(把virtual去掉就正常了),而且

  1. delete(new B());
复制代码

或者

  1. B *p = new B;
  2. delete p;
复制代码

是正常的


最佳答案

查看完整内容

vs2012会陷入死循环。这个问题楼主不要纠结。 如果想通过基类指针删除子类实例的话,请把基类的洗狗函数声明成虚函数。具体参考 effective c++
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-24 23:11:06 | 显示全部楼层
vs2012会陷入死循环。这个问题楼主不要纠结。

如果想通过基类指针删除子类实例的话,请把基类的洗狗函数声明成虚函数。具体参考 effective c++
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 00:16:25 | 显示全部楼层
大概是编译器的问题。测试在CodeBlocks下运行正常,在VC6下会出现同样的错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 00:27:50 | 显示全部楼层
感觉 code::block 好给力
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 14:59:35 | 显示全部楼层
没怎么见过那么写的,一般这样写
class A
{
        public:
                virtual void getA()=0;
};

class B:public A
{
         void getA(){}
};


int main(int argc, char* argv[])
{
        A *p=new B();
        delete p;
        return 0;
}
抽象类,纯虚函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 16:27:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 21:57:50 | 显示全部楼层
本帖最后由 565123 于 2013-7-25 22:02 编辑
编程难 发表于 2013-7-24 23:11
vs2012会陷入死循环。这个问题楼主不要纠结。

如果想通过基类指针删除子类实例的话,请把基类的洗狗函数 ...

谢谢啦,真的解决问题了,不过甲鱼哥好像没讲到:D
而且为啥把virtual去掉就没问题了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-26 10:11:53 | 显示全部楼层
565123 发表于 2013-7-25 21:57
谢谢啦,真的解决问题了,不过甲鱼哥好像没讲到
而且为啥把virtual去掉就没问题了?

c++标准规定 用基类指针删除子类对象,并且基类的析构函数不是虚函数的话, 是未定义的行为,所以可能正常运行也可能不运行。可以跟踪反汇编代码一看究竟。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-18 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表