子类的this和父类this的疑问

悟迟 2011-02-23 11:00:15
如果类是这样做的,这个this指向谁呢?
[code=C]/C++class A
{
public:
Destory()
{
delete this;
}
};

class B : public A
{

};

class B b;
b.Destory();// 这里面 delete的 this是谁呢? [/code]
...全文
319 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
悟迟 2011-02-24
  • 打赏
  • 举报
回复
C++ 编程设计语言
昵称很不好取 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]
b.Destory();// 对这个函数里面的this指针类型来说它就是A*,但是这个this指针指向的是一个B类型的对象,仅此而已。
[/Quote]
额,现在编译器一般都是把父类布局在子类的最上层,在函数里A*可以强制转换为B*,但不保证移植性
pengzhixi 2011-02-23
  • 打赏
  • 举报
回复
b.Destory();// 对这个函数里面的this指针类型来说它就是A*,但是这个this指针指向的是一个B类型的对象,仅此而已。
bdmh 2011-02-23
  • 打赏
  • 举报
回复
只有new了,菜要delete
無_1024 2011-02-23
  • 打赏
  • 举报
回复
有问题啊 不能这么用的
pathuang68 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

问题
额,你b对象是分配在栈上的如果delete那么崩溃了。
[/Quote]
是的,b对象不是new出来的,就不用delete了,到下一个"}",系统就会自动将b回收了。
这样的确会崩溃。
  • 打赏
  • 举报
回复
this指向的还是A
pengzhixi 2011-02-23
  • 打赏
  • 举报
回复
问题
额,你b对象是分配在栈上的如果delete那么崩溃了。
昵称很不好取 2011-02-23
  • 打赏
  • 举报
回复
这样用法有点问题。

就问题本身this指向class A,因为传递的时候会对b进行切割,只传递class A部分
breakerzy 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]

能否析构全部在于它有没有虚析构函数
[/Quote]
pengzhixi 说的对,但 LZ 你要明白这和你的问题可能不是一个东东。(两个问题,1 多态对象 2 完全析构,pengzhixi 说的是这个)
建议读读 RTTI 的东西。BS 的那本《C++ 编程设计语言》我记得好像是上半部的最后一章是讲 RTTI 和类型漫游 和本体概念 的。

多动动手就行了。
breakerzy 2011-02-23
  • 打赏
  • 举报
回复
典型的类型截断。

你自己看看:


class A
{
public:
void destory()
{
printf("A::destroy() this = 0x%08x, type = %s\n", (void*) this, typeid(*this).name());
delete this;
}
//int a;

// uncomment below to make the class and its subclass to be polymorphic
// virtual void vfunc()
// {
// }
};

class B : public A
{
//int b;
};

void test_03()
{
B* b = new B;

printf("b = 0x%08x, type = %s\n", (void*) b, typeid(*b).name());
b->destory();
}



输出:

b = 0x003b8bc8, type = class B
A::Destroy() this = 0x003b8bc8, type = class A

把 virtual void vfunc() 去注释后:

b = 0x003b8bc8, type = class B
A::destroy() this = 0x003b8bc8, type = class B

yxwsbobo 2011-02-23
  • 打赏
  • 举报
回复
做个测试就知道了


this 应该是Class A

在CLASS A中生成代码的时候并不知道CLASS B 所以他没办法释放掉B或其他继承自他的类
pengzhixi 2011-02-23
  • 打赏
  • 举报
回复
能否析构全部在于它有没有虚析构函数
Defonds 2011-02-23
  • 打赏
  • 举报
回复
还真没考虑过这么写
昵称很不好取 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wozhaolala 的回复:]
啊呀,写错了,应该是B* b = new B
[/Quote]
delete不会delete类B的全部,只会delete类B中class A所包含的部分
悟迟 2011-02-23
  • 打赏
  • 举报
回复
啊呀,写错了,应该是B* b = new B

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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