工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2194|回复: 7

程序找错???请解释为什么???

[复制链接]
发表于 2008-4-14 20:25 | 显示全部楼层 |阅读模式
class mml
{
private:
    static unsigned int x;
public:
    mml(){ x++; }
    mml(static unsigned int &) {x++;}
    ~mml{x--;}
pulic:
    virtual mon() {} = 0;
    static unsigned int mmc(){return x;}
    ......                     

};
class nnl:public mml
{
private:
    static unsigned int y;
public:
    nnl(){ x++; }
    nnl(static unsigned int &) {x++;}
    ~nnl{x--;}
public:
    virtual mon() {};
     static unsigned int nnc(){return y;}
    ......                  
};代码片断:
mml* pp = new nnl;
..........
delete pp;

A:
基类的析构函数应该为虚函数
virtual ~mml{x--;}
发表于 2008-4-14 21:57 | 显示全部楼层
笔试题?
回复

使用道具 举报

发表于 2008-4-15 15:54 | 显示全部楼层
C++ Primer上说:如果删除基类指针,则需要允许基类析构函数并清除基类的成员,如果对象实际是派生类型,则没有定义该行为。要保证运行适当的析构函数,基类的析构函数必须为虚函数。
如果析构函数为虚函数,那么通过指针调用,运行那个析构函数将因指针所指对象类型的不同而不同……
so……
回复

使用道具 举报

发表于 2008-4-15 18:12 | 显示全部楼层
the deconstructor of base class should be vitrual. Or when deleting, the object of derive class will not be deleted.
回复

使用道具 举报

 楼主| 发表于 2008-4-16 00:15 | 显示全部楼层
还是不明白!!!!
回复

使用道具 举报

发表于 2008-4-16 00:21 | 显示全部楼层
找书看吧。。。。很基础的东西。。。
回复

使用道具 举报

发表于 2008-4-17 22:14 | 显示全部楼层
子类对象的析构要调用子类的析构函数, 在子类的析构函数里会自动调用父类的析构函数(不需要你自己编写,构造函数同理).    用基类指针指向子类对象时, 为确保delete时调用的是子类的析构函数, 需要在基类的析构函数前加上virtual关键字( 则子类的析构函数会默认成为虚函数, 防入该类的虚表中)
如果你的类不用于继承或多态, 不用使用virtural
回复

使用道具 举报

发表于 2008-4-17 22:26 | 显示全部楼层
问题其实就是多态在C++中如何实现。。。
一个设计原则:
C++基类的析构函数都应该是virtual
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 13:30

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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