怎么理解虚函数是在run time时选择的?这里的run time怎么理解?

parachutes30 2014-09-12 06:37:30
Class A {
public:
virtual void print(){...}
};

Class B : public A {
public:
void print(){...}
};

int main()
{
B b;
A* pa=&b;
pa->print();
}

当程序编译链接(compile time)后,根据虚函数的原则,main函数中不是已经注定要执行B::print()函数了吗?

run time是什么意思呢?不就是执行main函数的代码吗?
我所不理解的地方在哪?
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
parachutes30 2014-09-15
  • 打赏
  • 举报
回复
自己琢磨了下,感觉就是编译器会在虚函数调用的地方加入在运行时选择虚函数的代码。
赵4老师 2014-09-15
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
mujiok2003 2014-09-14
  • 打赏
  • 举报
回复
引用 3 楼 u010928112 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] 对于你的例子, 编译可以优化。

void print(A& a)
{
  a.print();  
}
但是上面这个函数则很难在编译时优化,因为不知道a的动态类型。
编译器对于我的例子具体优化了什么?[/quote] 不是优化了, 可以优化, 因为从上下文可以容易推断出其动态类型。
parachutes30 2014-09-14
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
对于你的例子, 编译可以优化。

void print(A& a)
{
  a.print();  
}
但是上面这个函数则很难在编译时优化,因为不知道a的动态类型。
编译器对于我的例子具体优化了什么?
mujiok2003 2014-09-12
  • 打赏
  • 举报
回复
对于你的例子, 编译可以优化。

void print(A& a)
{
  a.print();  
}
但是上面这个函数则很难在编译时优化,因为不知道a的动态类型。
勤奋的小游侠 2014-09-12
  • 打赏
  • 举报
回复
no并不是注定的,函数是一个入口,编译时编译器只是提供了一个指针偏移值,这个偏移值指向那一个函数入口地址是由运行时指针指向什么样的对像决定的。这就是run time.具体原理,请参考c++深度模型这本书。

33,311

社区成员

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

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