初学,请释疑解惑

匚匚 2011-02-18 08:50:25
[code=C]#include<iostream>
using namespace std;

class A
{
public:
virtual void f()const{cout<<"A::F"<<endl; }
void show(){f();}
};
class B:public A
{
public:
virtual void f()const{cout<<"B::F"<<endl; }
};
int main()
{
A a,*pa;
B b;
pa=&b;
//pa->f();
pa->show();
a.show();
a=b;
a.show();//此处调用f()难道不通过虚表?a的虚表难道没被b的虚表所覆盖?

return 0;
}[/code]
...全文
141 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2011-02-19
  • 打赏
  • 举报
回复
指针才能引发多态.. 可以看下多态方面的知识
匚匚 2011-02-19
  • 打赏
  • 举报
回复
再次验证自己的理解:


int *pfa=NULL,*pfb=NULL;
pfa=(int*)*(int*)(&a);
pfb=(int*)*(int*)(&b);
cout<<pfa<<" "<<pfb;
a/b的虚表指针并不一样(自己重载=以前)
匚匚 2011-02-19
  • 打赏
  • 举报
回复
忽然想起书上一句话:这种赋值是对对象的数据成员赋值,而虚表并不是对象的一个数据成员(虽然占用了它的内存空间)
不知道编译器是如何隐式地进行等号运算符的重载的?应该会用到模板吧?
我试着自己重载了一下“=”:结果立马改变,呵呵


[code=C]A A::operator=(B& b)
{
*(int*)(this)=*(int*)(&b);
return *this;
}[/code]
匚匚 2011-02-18
  • 打赏
  • 举报
回复
但show函数中调用了虚函数啊,而这个虚函数调用是通过虚表指针在虚表中找到要调用虚函数的地址的啊
羽飞 2011-02-18
  • 打赏
  • 举报
回复
对象调用是不通过虚表指针调用函数的,只有引用和指针才会搜索虚表
匚匚 2011-02-18
  • 打赏
  • 举报
回复
改一下:

a.show();//此处调用f()难道不通过虚表指针?a的虚表指针难道没被b的虚表指针所覆盖?
Kiven 2011-02-18
  • 打赏
  • 举报
回复
答案是这样的,引用 和 指针 不重新分配对象的内存,

B::F

A:F

A:F
匚匚 2011-02-18
  • 打赏
  • 举报
回复
a=b;

/*从内存形式来说,是将b所在内存中的虚表指针的值赋给了a实例内存中的虚表指针。a/b在内存中都占四个字节.
*由于a中的f()是虚函数,所以a.show()仍然会通过a中的虚表指针去调用f()函数
*/
这是我的理解,对否?错的话,是进入了什么误区?
bluesky12312388 2011-02-18
  • 打赏
  • 举报
回复
只有指针和引用才能多态, 至于你说的虚表,每个对象都有它自己的,没有什么覆盖不覆盖的
昵称很不好取 2011-02-18
  • 打赏
  • 举报
回复
a=b,执行这句的时候其实只会拷贝父类a中的数据到a中,而b中不属于父类的成员将被抛弃
昵称很不好取 2011-02-18
  • 打赏
  • 举报
回复
只有父类指针和引用指向子类时才引发多态,单纯对象a只会调用自己的成员函数

65,189

社区成员

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

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