继承

code_cold 2002-07-29 06:17:25
#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////////////////////////////////////
class CBase {
public:
CBase() {cout << "CBase" << endl;}
// virtual ~CBase() {cout << "~CBase" << endl;} // Must be virtual func
~CBase() {cout << "~CBase" << endl;}
};

//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
class CDerived : public CBase
{
public:
CDerived() {cout << "CDerived" << endl;}
virtual ~CDerived() {cout << "~CDerived" << endl;}
// ~CDerived() {cout << "~CDerived" << endl;}
};

//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
void Func(CBase* pObj) {

delete pObj;

cout << "here" << endl;
}

int main() {

CDerived* pObj = new CDerived;

Func(pObj);

cout << "returned" << endl;

return 0;

}

为什么错了
...全文
39 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
code_cold 2002-07-30
  • 打赏
  • 举报
回复
"也就是会调用基类的destructor(析构函数),结果是析构不了"

CDerived* pObj = new CDerived;
CBase* pBaseObj = static_cast<CBase*> (pObj);

是否是因为在"CBase* pBaseObj = static_cast<CBase*> (pObj);"这句
使pObj的vtable 丢失 ????
leizhengdeng 2002-07-30
  • 打赏
  • 举报
回复
code_cold(橘右京傲战八方)
上次也是你提的关于虚函数的问题,
记住:
如果是非虚函数,那么就会根据类的类型调用相应的函数
如果是虚函数,就会根据虚函数表调用相应的函数。
FFXI 2002-07-30
  • 打赏
  • 举报
回复
是的,因为CBase本身没有vtable.
wangran 2002-07-29
  • 打赏
  • 举报
回复
不好意思,本来想进一步说的,可是这网页怎么也刷不开,csdn可真是慢呀!
闲话少说,书归正传:如果你想这么用的话:
CBase * pB=new CDerived;
delete pB;
你就的把base class的destructor声明为virtual,否则就会发生错误,也就是会调用基类的destructor(析构函数),结果是析构不了。
wangran 2002-07-29
  • 打赏
  • 举报
回复
我运行了一下,如果你把基类和派生类的析构函数都声明为virtual的话就没错,因为如果基类的析构函数不是virtual的话,你传入函数Func()的指针是指向基类CBase的,编译器不知道实际的对象是CDerived的对象,在调用析构函数的时候只能调用CBase::~Base(),当然会出现错误.详细的讨论见<<Effective C++>>的第14条:"总是让base class拥有virtual destructor".

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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