打印

C++多态问题

[复制链接]
1328|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yybj|  楼主 | 2012-3-7 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//基类
class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
};
//子类
class Case : public Base
{
public:
void f() { cout << "Case::f1" << endl; }
};
int main()
{
  Base *B = new Case;
  B->f();
}
主函数里的第一句是用子类去实例化一个基类对象,他为什么就掉用了 Case::f1,而不是Base::f1呢??
就算是找虚拟表 这个类型毕竟是Base类型的 他的f()函数也是虚的 为什么查找虚拟表的时候没找到自己的 而找到了子类的呢??

相关帖子

沙发
火箭球迷| | 2012-3-7 18:27 | 只看该作者
因为不同对象vptr所指的vtable不同。Case对象的vptr自然就指向Case类的vtable

使用特权

评论回复
板凳
xsgy123| | 2012-3-7 20:53 | 只看该作者
程序员不需要了解虚函数表即多态的实现原理,我们只需要知道如何用就可以了

使用特权

评论回复
地板
sinadz| | 2012-3-8 21:29 | 只看该作者
多态是C++比较难理解的问题

使用特权

评论回复
5
dong_abc| | 2012-3-8 22:56 | 只看该作者
程序员不需要了解虚函数表即多态的实现原理,我们只需要知道如何用就可以了
xsgy123 发表于 2012-3-7 20:53


非也

使用特权

评论回复
6
highgear| | 2012-3-9 22:47 | 只看该作者
程序员不需要了解虚函数表即多态的实现原理,我们只需要知道如何用就可以了


这种态度,很难成为一个真正的c++高手, 甚至很难成为技术高手。

只要有一个 virtual 函数,class 以及派生类的数据头部(一般是第一个位置)就都包含有一指针,该指针指向一个虚函数表,每一个类都有自己的虚函数表,该表中存放各个虚函数的地址,即函数指针。B->f() 调用时, 从 B 的头部取出指针,找到虚函数执行,即:
typedef void (*FunctionPtr)()

FunctionPtr* vtable = (FunctionPtr*) B;  //虚函数表
(*vtable[0])();   // call f();

使用特权

评论回复
7
无冕之王| | 2012-3-10 11:11 | 只看该作者
一个好的程序员还是需要了解多态的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

2496

帖子

1

粉丝