有关虚函数,请教各位

darcymei 2003-11-05 06:06:58
#include<iostream>
#include<string>
using namespace std;

class a
{
public:
virtual void fun(void){cout<<"a.fun()"<<endl;}
};

class b: public a
{
public:
void fun(void){cout<<"b.fun()"<<endl; a::fun();}
};

int main()
{
b temp;
temp.fun ();
return 0;
}

我们知道虚函数的实现是动态绑定,在调用时通过this指针查找虚函数表得到。
问题是,我在b中调用a::fun()时,this指针指向的是b的虚函数表,怎么能够查到a的fun()呢?
希望聆听大家的高见。
...全文
35 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
limd 2003-11-06
  • 打赏
  • 举报
回复
一楼回答还可以
Robin 2003-11-06
  • 打赏
  • 举报
回复
UP!~
zhaochong12 2003-11-05
  • 打赏
  • 举报
回复
谢谢..
babyboy321 2003-11-05
  • 打赏
  • 举报
回复
up
hawkxjy 2003-11-05
  • 打赏
  • 举报
回复
只所以能够在虚函数中调用父类的方法,是a::fun()中的类别限定符a::的功劳
,它告诉编译器后面的函数必须是在类a中的函数,起到了限制的作用,而不必
再从虚函数表中匹配。
短歌如风 2003-11-05
  • 打赏
  • 举报
回复
C++提供这种调用方法是为了我们可以在衍生类中重用基类的实现:
#include <iostream>

class Base
{
public:
virtual void foo();
};

void Base::foo()
{
std::cout << "I am a Base!" << std::endl;
}

class Derived: public Base
{
public:
void foo();
};
void Derived::foo()
{
Base::foo();//重用基类的实现
std::cout << "I am a Derived also!" << std::endl;
}

#define TRACK(X) std::cout << "********* " << #X << " ***********" << std::endl, X
main()
{
Base a;
Derived b;
Base *pa;
Derived *pb;
TRACK(a.foo());
TRACK(b.foo());
TRACK(b.Base::foo());
TRACK(pa = & a);
TRACK(pa -> foo());
TRACK(pa -> Base::foo());
TRACK(pa = &b);
TRACK(pa -> foo());
TRACK(pa -> Base::foo());
TRACK(pb = &b);
TRACK(pb -> foo());
TRACK(pb -> Base::foo());
}
运行结果为
********* a.foo() ***********

I am a Base!

********* b.foo() ***********

I am a Base!

I am a Derived also!

********* b.Base::foo() ***********

I am a Base!

********* pa = & a ***********

********* pa -> foo() ***********

I am a Base!

********* pa -> Base::foo() ***********

I am a Base!

********* pa = &b ***********

********* pa -> foo() ***********

I am a Base!

I am a Derived also!

********* pa -> Base::foo() ***********

I am a Base!

********* pb = &b ***********

********* pb -> foo() ***********

I am a Base!

I am a Derived also!

********* pb -> Base::foo() ***********

I am a Base!

短歌如风 2003-11-05
  • 打赏
  • 举报
回复
当你使用a::fun()调用时,它不会去访问b的vtpr,只会直接定位到a::fun去调用。
只有用p->fun//p是一个指针它才会调用虚函数。

在成员函数中调用成员函数时相当于this->...

a::fun()相当于this->a::fun(),这时不访问vtpr。
fun()相当于this->fun(),这时会访问vptr以得到虚函数指针。

64,637

社区成员

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

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