入门问题:子类在构造函数中调用了父类的构造函数,是否必须在析构函数中调用父类的析构函数

nde123456 2009-04-10 04:33:45
从string类派生一个MyString类,构造函数中调用了父类string的构造函数
class MyString : public string
{
public:
explicit MyString () :string() {}
MyString ( const char *s ) : string(s) {}
};

是否需要再写一个析构函数,调用父类string的析构函数?
...全文
380 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
漁_夫 2010-03-08
  • 打赏
  • 举报
回复
引用 1 楼 yyyapple 的回复:
子类析构时,会先调用父类析构函数,不用明确调用


错了吧,老大
中才德创 2009-04-11
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class Grandpa
{
public:
Grandpa(void);
~Grandpa(void);
protected:
private:
};

class Father : Grandpa
{
public:
Father(void);
~Father(void);
protected:
private:
};

class Son : Father
{
public:
Son(void);
~Son(void);
protected:
private:
};

int _tmain(int argc, _TCHAR* argv[])
{
{
Son s;
cout << "----------}前----------" << endl;
}
cout << "----------}后----------" << endl;
/*
//输出
构造 Grandpa::Grandpa(void)"
构造 Father::Father(void)
构造 Son::Son(void)
"----------}前----------"
析构 Son::~Son(void)
析构 Father::~Father(void)
析构 Grandpa::~Grandpa(void)
"----------}后----------"
*/

return 0;
}

Grandpa::Grandpa(void)
{
cout << "构造 Grandpa::Grandpa(void)" << endl;
}

Grandpa::~Grandpa(void)
{
cout << "析构 Grandpa::~Grandpa(void)" << endl;
}

Father::Father(void)
{
cout << "构造 Father::Father(void)" << endl;
}

Father::~Father(void)
{
cout << "析构 Father::~Father(void)" << endl;
}

Son::Son(void)
{
cout << "构造 Son::Son(void)" << endl;
}

Son::~Son(void)
{
cout << "析构 Son::~Son(void)" << endl;
}


这可能与类继承的设计机制有关。子类可能会用到父类的成员信息,反之却不可能。如果父类构造‘后’执行的话,子类用到父类的成员信息,即便父类构造函数中合法化了成员信息,子类用上的也是未合法化的。

至于,为什么必须‘先’析构子类,就不明白为什么了。
Kevin_Perkins 2009-04-11
  • 打赏
  • 举报
回复
创建对象时,先调用父类构造函数,再调用子类构造函数;
撤销对象时,先调用子类析构函数,再调用父类析构函数。
所有操作都自动完成。我认为这种调用发式是继承机制决定的。
xuhb95083023 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nde123456 的回复:]
我仅仅需要对string做点微小的扩充,该不该加这个explicit?
[/Quote]

这个explicit没有任何意义,只有针对只有一个参数的构造函数的时候才考虑是否加上explicit
nde123456 2009-04-10
  • 打赏
  • 举报
回复
我仅仅需要对string做点微小的扩充,该不该加这个explicit?
march_zhou 2009-04-10
  • 打赏
  • 举报
回复
3楼正解,explicit只是个修饰词
aaaa3105563 2009-04-10
  • 打赏
  • 举报
回复
顶········
xmanlin 2009-04-10
  • 打赏
  • 举报
回复
支持楼上的解释.
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nde123456 的回复:]
那么我不用为MyString专门写个析构函数?

还有
explicit MyString () :string() {}
这句话是什么意思?是必须的吗?
特别是这个explicit不明白?
[/Quote]

如果你的子类里没有new,基本可以不考虑自己写析构.

explicit声明的构造函数不能发生隐式转换.
你自己google一下细节吧.
nde123456 2009-04-10
  • 打赏
  • 举报
回复
那么我不用为MyString专门写个析构函数?

还有
explicit MyString () :string() {}
这句话是什么意思?是必须的吗?
特别是这个explicit不明白?
yyyapple 2009-04-10
  • 打赏
  • 举报
回复
子类析构时,会先调用父类析构函数,不用明确调用

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧