虚函数的迷思

wjb_yd 2008-11-15 10:20:05
class A
{
public:
virtual void f() { }
};

class B : public A
{
public:
virtual void f() { }
};

int main()
{
A *p=new B;
p->f();
return 0;
}

大家都知道,每个类有个虚表,每个对象中有个虚指针
当执行到p->f()时,编译器会动态的根据vptr找到vtable,然后在固定的索引位置找到B::f()的地址,调用它
这种间接的调用会有效率上的损失

那么,为什么编译器不能在符号表中跟踪p指向的实际类型,从而在执行p->f()的时候,静态的决议为B::f()呢???
这种想法实现起来很困难么???
...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb_yd 2008-11-16
  • 打赏
  • 举报
回复
3l说的有道理,结贴~
bfhtian 2008-11-15
  • 打赏
  • 举报
回复
多态性决定了需要动态编译,用静态的方法很难确定吧,支持3楼
BaihowFF 2008-11-15
  • 打赏
  • 举报
回复
再怎么着编译器也是电脑啊...不是人脑...无法达到智能化...
而且就算编译器智能化...不是说不能早绑定...那需要更多的时间和算法去计算...本来C++的编译器的速度就够慢了...更加复杂化的不应该是编译器了...而是库...
K行天下 2008-11-15
  • 打赏
  • 举报
回复
虚函数就是要实现动态绑定
星羽 2008-11-15
  • 打赏
  • 举报
回复

#include "iostream"
using namespace std;

class A
{
public :
virtual void f() { }
};

class B : public A
{
public :
virtual void f() { }
};

class C : public A
{
public :
virtual void f() { }
};


int main()
{
int n = 0;

cin>>n;

A* p = NULL;

if (n > 0)
p = new B;
else
p = new C;

// 请问你编译器在编译的时候如何跟踪 p

return 0;
}
wuyu637 2008-11-15
  • 打赏
  • 举报
回复
那样的可操作性太低。就是会有很多更复杂的问题出现,
liumingrong 2008-11-15
  • 打赏
  • 举报
回复
如果你有一个函数

void test(A* a)
{
a->f(); //这里应该怎么静态决议呢?
}

A *p1 = new B;
A *p2 = new A;
test(p1);
test(p2);

语法本来就是上下文无关的,是没有记忆的

65,211

社区成员

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

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