关于析构函数

有点清眸 2014-11-03 11:43:44

#include <iostream>

using namespace std;

class base
{
public:
base(){}
virtual ~base() = 0;
};

base::~base()
{
cout << "base destrution..."<< endl;
}

class derive :public base
{
public:
derive()
{

}
~derive()
{
cout << "before..." << endl;
base::~base();
cout << "end..." << endl;
}

};

int main(int argc, char const *argv[])
{
derive test;
return 0;
}


代码如上,我在继承类中显式调用基类的析构函数,提示报错:
virtual.cpp: In destructor ‘virtual derive::~derive()’:
virtual.cpp:27: 错误:no matching function for call to ‘derive::base()’
virtual.cpp:12: 附注:备选为: virtual base::~base()

对报错内容不理解,为什么会这样?
...全文
301 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
principl 2014-11-05
  • 打赏
  • 举报
回复
你如果在g++下编译运行,结果更是令你匪夷所思!
lm_whales 2014-11-04
  • 打赏
  • 举报
回复
怀疑你找到了编译器的一个bug ,这个错误信息很奇怪, 我猜它是想说,析构函数里,不应该主动调用基类的析构函数。 或者编译器询问你,这里,是否定义了一个嵌入类型 derive::base 而这里,找不到匹配的 derive::base的构造函数 derive::base() 于是这个 base::~base();只找到一个匹配的备选函数 于是就说: 。。。。。。。。。。。。。。。。。。 virtual.cpp:12: 附注:备选为: virtual base::~base()
梦回十年 2014-11-04
  • 打赏
  • 举报
回复
测试,一下没问题
mujiok2003 2014-11-04
  • 打赏
  • 举报
回复
引用 17 楼 Yaoxin_ 的回复:
[quote=引用 13 楼 u012948520 的回复:] 是不是析构都是先子类再父类 你在子类析构函数里面显示析构掉了父类 执行完子类的析构函数的时候,找不到父类以执行父类的析构函数 就会报错 如果能运行的话,你单步调试,应该
~derive()
    {
        cout << "before..." << endl;
        base::~base();
        cout << "end..." << endl;
    }
执行完最后一个括号,就出会错
是编译期出错的,不是运行期。 其实我只是想知道g++编译器在背后做了些什么,为什么会提示这样的错误。 [/quote] 应该是重载解析时出错了, 你应该看看C++标准怎么说。
白衣如花 2014-11-04
  • 打赏
  • 举报
回复
引用 14 楼 mujiok2003 的回复:
[quote=引用 13 楼 u012948520 的回复:] 是不是析构都是先子类再父类 你在子类析构函数里面显示析构掉了父类 执行完子类的析构函数的时候,找不到父类以执行父类的析构函数 就会报错 如果能运行的话,你单步调试,应该
~derive()
    {
        cout << "before..." << endl;
        base::~base();
        cout << "end..." << endl;
    }
执行完最后一个括号,就出会错
为啥会出错?你认为会出什么错?[/quote] 刚特意抄了一遍代码。vs2008没报错。。。我错了,原来可以在子类中手动调用父类的析构啊
mrlgy 2014-11-03
  • 打赏
  • 举报
回复
virtual ~base() = 0; =0是抽象类的嘛,去掉看看
h1048576 2014-11-03
  • 打赏
  • 举报
回复
声明为virtual后,子类对象析构时,会自动调用基类的析构
有点清眸 2014-11-03
  • 打赏
  • 举报
回复
引用 10 楼 lovesmiles 的回复:
~derive() { cout << "before..." << endl; base::~base(); cout << "end..." << endl; } 在析构函数里面不应该再显式调用父类的析构。
能不能从内部实现的角度讲一讲why?
有点清眸 2014-11-03
  • 打赏
  • 举报
回复
引用 16 楼 xigangcpp 的回复:
你写这段代码完全没必要显示写出构造函数和析构函数, 只有在你分配资源时,才需要显示的构造和析构
我是在看深入理解c++对象模型 构造语义这一章时,随手写的测试代码。故意使之,看看编译器做了些什么。
有点清眸 2014-11-03
  • 打赏
  • 举报
回复
引用 13 楼 u012948520 的回复:
是不是析构都是先子类再父类 你在子类析构函数里面显示析构掉了父类 执行完子类的析构函数的时候,找不到父类以执行父类的析构函数 就会报错 如果能运行的话,你单步调试,应该
~derive()
    {
        cout << "before..." << endl;
        base::~base();
        cout << "end..." << endl;
    }
执行完最后一个括号,就出会错
是编译期出错的,不是运行期。 其实我只是想知道g++编译器在背后做了些什么,为什么会提示这样的错误。
wxgchrome123 2014-11-03
  • 打赏
  • 举报
回复
你写这段代码完全没必要显示写出构造函数和析构函数, 只有在你分配资源时,才需要显示的构造和析构
追梦浮云 2014-11-03
  • 打赏
  • 举报
回复
报错可能是编译器设置的等级问题, 像11楼同志说的一样 不过在会执行两次基类(父类)的析构函数,显式调用一次,系统默认调用一次。
mujiok2003 2014-11-03
  • 打赏
  • 举报
回复
引用 13 楼 u012948520 的回复:
是不是析构都是先子类再父类 你在子类析构函数里面显示析构掉了父类 执行完子类的析构函数的时候,找不到父类以执行父类的析构函数 就会报错 如果能运行的话,你单步调试,应该
~derive()
    {
        cout << "before..." << endl;
        base::~base();
        cout << "end..." << endl;
    }
执行完最后一个括号,就出会错
为啥会出错?你认为会出什么错?
白衣如花 2014-11-03
  • 打赏
  • 举报
回复
是不是析构都是先子类再父类 你在子类析构函数里面显示析构掉了父类 执行完子类的析构函数的时候,找不到父类以执行父类的析构函数 就会报错 如果能运行的话,你单步调试,应该
~derive()
    {
        cout << "before..." << endl;
        base::~base();
        cout << "end..." << endl;
    }
执行完最后一个括号,就出会错
mujiok2003 2014-11-03
  • 打赏
  • 举报
回复
base::~base();
-->
this->base::~base();
当然这里没有必要显示调用析构函数
lm_whales 2014-11-03
  • 打赏
  • 举报
回复
这个编译器比较认真, 或者你的编译器,现有配置中 设置的错误等级比较高,所有警告都当作错误处理。
勤奋的小游侠 2014-11-03
  • 打赏
  • 举报
回复
~derive() { cout << "before..." << endl; base::~base(); cout << "end..." << endl; } 在析构函数里面不应该再显式调用父类的析构。
principl 2014-11-03
  • 打赏
  • 举报
回复
用Visual c++ 6.0编译链接没有任何错误。
有点清眸 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 zhouxiaofeng1021 的回复:
没有错误。。。。
能否发一下执行的结果 我用的是g++,不同编译器可能有所区别。
zhouxiaofeng1021 2014-11-03
  • 打赏
  • 举报
回复
没有错误。。。。
加载更多回复(4)

64,654

社区成员

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

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