读书人

[正确就结贴]重载构造函数与析构函数的

发布时间: 2012-02-16 21:30:36 作者: rapoo

[正确就结贴]重载构造函数与析构函数的一个有趣的问题
NOW..

目标:重载TStringList类,加入了一些新的property和method。
情况:由于我在派生类里,也有构造和析构函数,但是没有进行任何的特别声明
没有加什么(overload或是什么的)

需要实现的问题,因为大家知道TStringList类本身有构造函数,我最近也在玩delphi,好象delphi里可以使用reintroduce;隐藏带基类中的同名方法,而由于我的派生类只是在create的时候,建立了几个新的参数,
所以,我的派生类中的基类函数带了参数,而TstringList的构造函数没有参数,这样是不是实际上是重载了构造函数,

而由于delphi中派生类如果还想使用基类中同名函数的时候,可以在函数中加入
introduce create(。。。);

但是BCB中没有...翻了一下书好象,看到就是直接调用
例如
TStringList::TStringList(); //OK 我单步调试的时候没有问题,考虑可能是由于我的构造函数有参与,不会由基类冲突


问题来了:
我在析构函数中,把我自己new出来的一些指针释放,
SO

我先调用TStringList::~TStringList();
delete a;


但是这里就有问题,我单步的时候,在执行~TStringList()的时候,会不停的调用我自己写的析构函数(可能因为他们的参数相同,就是没有任何的参数,而我的析构函数实际上叫~TRegIniStringList() )

由于最近在转delphi写一些东西,发觉delphi与bcb差不多,还有新版本嘿嘿,在关于重载等的问题,有点迷晕。。

那位指点一下,如何先调基类里的析构函数,然后并执行一下我自己的释放操作呢?


[解决办法]
如何先调基类里的析构函数,然后并执行一下我自己的释放操作呢?

看来你是C++的基础不扎实啊
可以看一下C++的虚函数
virtual
[解决办法]
从lz的说明就可以看出lz的delphi还没学好基础。reintroduce不是你说的那回事情,也不是那样的用法。

// 这里代码出了问题,会不停的call自己.死锁几次以后程序异常抛出。
代码在哪里?
另建议你先释放你自己的资源然后再调用父类的析构函数。

[解决办法]
class TCheckRegIniList : public TStringList{......};

__fastcall TCheckRegIniList::TCheckRegIniList(AnsiString IniPosition,AnsiString IniSection, HKEY RegRoot, AnsiString RegPath):TStringList::TStringList( )
{
TStringList::TStringList( );
//放在是不行的,C是建一新的TStringList,要放在初始化列表中,才。
}

__fastcall TCheckRegIniList::~TCheckRegIniList( )
{
TStringList::~TStringList( ); //不能在用父的析函,引起循用,会不停的call自己。C++在析自用父的析函的。
}


读书人网 >C++ Builder

热点推荐