首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 还没来得及回就结了。。。 [已结贴,结贴人:paidfighting]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-03-17 17:11:05 楼主
    基类指针指向子类对象数组的问题

    http://topic.csdn.net/u/20080317/14/6bdac337-f8c1-4733-8c28-8dfae792c1b8.html

    恕我挑战专家,这贴的答案是不对的啊。。。

    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:12:261楼 得分:0
    看代码:

    C/C++ code
    class Base { public: Base() { cout<<"Base()"<<endl; } virtual ~Base() { cout<<"~Base()"<<endl; } }; class Child:public Base { public: Child() { cout<<"Child()"<<endl; } virtual ~Child() { cout<<"~Child()"<<endl; } }; int main(int argc, char* argv[]) { Child x; return 0; }


    子类对象被析构时,基类析构函数当然也会被调用。。。要不然基类里的东西怎么办?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:18:492楼 得分:1
    你说的就是正确的,这个跟那个有什么关系么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:19:273楼 得分:1
    觉得不对就直接开贴反驳,不用顾忌什么专家不专家的...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dubiousway
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:19:544楼 得分:0
    看了下原贴。
    这个和析构函数是不是虚函数没关系
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Supper_Jerry
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:20:385楼 得分:1
    子类对象被析构时,基类析构函数当然也会被调用。。。
    这个是毋庸置疑的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:22:356楼 得分:0
    引用 2 楼 akirya 的回复:
    你说的就是正确的,这个跟那个有什么关系么?


    嗯,你说那样用是不对的,下面是你的代码:

    C/C++ code
    #include<stdio.h> class Base { char sz[12]; public: virtual ~Base() { printf("Base::~Base\n"); } }; class test:public Base { int data[4]; public: ~test() { printf("Base::~Base\n"); } }; int main() { Base* p = new test[4]; delete[] p; return 0; }


    这样自然是会输出8个的啊,因为派生类和基类都会调用

    所以是可以用而且安全的啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:27:087楼 得分:0
    汗一个,是我搞错了,代码写错了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dubiousway
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:28:138楼 得分:0
    还没看懂这个贴子想讨论什么。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:28:459楼 得分:0
    就是啊,你把两个都写成了base。。。

    汗。。。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:30:3810楼 得分:0
    引用 8 楼 dubiousway 的回复:
    还没看懂这个贴子想讨论什么。


    讨论的是,
    “基类指针指向子类对象数组的问题 ”一贴里得出的结论是不对的。那贴说  基类指针指向子类对象数组  不可以使用

    但实际上,基类指针指向子类对象数组 是可以使用的而且是安全的

    而正是虚析构函数保证了这种安全性。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:31:5511楼 得分:0
    直接copy的代码,哎~~~
    不过这样的代码不能在gcc和bc上用。
    那两个输出的都是错误的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:33:2212楼 得分:0
    引用 11 楼 akirya 的回复:
    直接copy的代码,哎~~~
    不过这样的代码不能在gcc和bc上用。
    那两个输出的都是错误的。


    输出错误?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:36:1713楼 得分:0
    这代码在我这里怎么运行时错误?出错的行是int data[4];把它注释掉就正常了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:38:3414楼 得分:0
    gcc 直接coredump 也就是所谓的非法操作
    bc 输出了4次base::~base
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:39:4515楼 得分:0
    坏,这段代码确实有问题!

    你把最先的版本贴上来看看。我不关心你们的问题,我关心的是多态...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:42:4716楼 得分:0
    bc就算了。。可以不论

    gcc不允许这样的话。。。意思是不鼓励这样写代码吧。。。

    总之,设计角度讲确实不好,但是语言还是支持的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:43:2817楼 得分:0
    跟我的代码区别就是没有成员变量。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:43:3318楼 得分:0
    引用 13 楼 fetag 的回复:
    这代码在我这里怎么运行时错误?出错的行是int data[4];把它注释掉就正常了!



    哪来的int data[4]...眼神。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:44:1519楼 得分:0
    引用 18 楼 paidfighting 的回复:
    引用 13 楼 fetag 的回复:
    这代码在我这里怎么运行时错误?出错的行是int data[4];把它注释掉就正常了!



    哪来的int data[4]...眼神。。



    哦,确实有,我这里运行没问题啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:44:4820楼 得分:0
    OK,现在解决了。把最后那个delete应该改成

    delete [] (test*)p;

    才是正确的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:45:4121楼 得分:0
    眼神...o(∩_∩)o...哈哈

    确实有问题,原因如上,刚刚问了一个狂人...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:45:4722楼 得分:0
    引用 17 楼 akirya 的回复:
    跟我的代码区别就是没有成员变量。


    他说的是6楼,是copy你的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:47:2523楼 得分:0
    引用 20 楼 fetag 的回复:
    OK,现在解决了。把最后那个delete应该改成

    delete [] (test*)p;

    才是正确的!



    ?怎么会,那虚析构函数还顶什么用。。。反正我这里不用加test*p也行的,vs2005
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:48:4624楼 得分:0
    我测试的编译器
    gcc 版本 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 17:48:4825楼 得分:0
    你的.NET 05这点上很差!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

    发表于:2008-03-17 17:51:0726楼 得分:0
    那样的代码是不正确的,最起码有三个主流编译器表现的结果相差太大了。

    在那个帖子中我的理由错误了,但代码确实有问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paidfighting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-17 18:01:1827楼 得分:0
    引用 25 楼 fetag 的回复:
    你的.NET 05这点上很差!



    晕。。。。vc6也可以的

    从语言特性来说

    Base* p = new test[4];

    new test[4]返回指针 test*,然后将其赋给p,这时候p因为虚函数表的存在,实际上是“保存”了对象类型的,即它知道指向的是test而不是Base,它并不会丢失类型信息。

    所以delete[] p; 才能借助此机制成功析构对象

    这应该说是vs好才对吧。。
    修改 删除 举报 引用