派生类中的虚函数可以访问父类的虚函数,机制是什么?

独酌逸醉 2012-07-11 02:14:34
看代码:

virtual void dev_class::v_func1()
{
base_class::v_func1();
cout << "This is dev_class's v_func1()" << endl;
}


dev_class的虚函数表中,dev_class::v_func1()应该把base_class::v_func1()覆盖掉了,但是为什么还可以访问base_class::v_func1()呢?base_class::v_func1()的函数指针放在哪了呢?

求教,谢谢!
...全文
583 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
独酌逸醉 2012-07-11
[Quote=引用 7 楼 的回复:]

当派生类和父类有同名的虚函数的时候,派生类实际上并没有覆盖调父类的方法,当要访问父类同名方法的时候,可以通过base::method的方式调用!
[/Quote]
在派生类的虚函数表中,已经覆盖了。难道虚函数还存在另外一个位置吗?
回复
逆道而行 2012-07-11

其实父类虚函数就是为了让子类继承并从新定义的
回复
逆道而行 2012-07-11
[Quote=引用 4 楼 的回复:]

虚函数也是函数。子类的函数是可以调用父类的函数的。所以子类的虚函数是可以调用父类的虚函数的。vptr中是存放了虚函数的地址,但是并不是所有访问虚函数都得通过vptr。
有啥错误,敬请指正
[/Quote]

其它父类虚函数就是为了让子类继承并从新定义
回复
ZHOU西口 2012-07-11
当派生类和父类有同名的虚函数的时候,派生类实际上并没有覆盖调父类的方法,当要访问父类同名方法的时候,可以通过base::method的方式调用!
回复
skyabc 2012-07-11
1楼2楼正解,关键在于此处::的使用,和啥复杂的继承关系都没了
回复
独酌逸醉 2012-07-11
[Quote=引用 4 楼 的回复:]

虚函数也是函数。子类的函数是可以调用父类的函数的。所以子类的虚函数是可以调用父类的虚函数的。vptr中是存放了虚函数的地址,但是并不是所有访问虚函数都得通过vptr。
有啥错误,敬请指正
[/Quote]
好的,谢谢!
回复
W170532934 2012-07-11
虚函数也是函数。子类的函数是可以调用父类的函数的。所以子类的虚函数是可以调用父类的虚函数的。vptr中是存放了虚函数的地址,但是并不是所有访问虚函数都得通过vptr。
有啥错误,敬请指正
回复
独酌逸醉 2012-07-11
[Quote=引用 1 楼 的回复:]

这个不通过虚函数指针来调用, 和普通函数调用一样, 编译器直接把函数地址插入到调用的地方.
[/Quote]
谢谢你的回复。

base_class::v_func1();不是虚函数吗?虚函数不应该存放在 vtable 中吗?
回复
pathuang68 2012-07-11
[Quote=引用 1 楼 的回复:]

这个不通过虚函数指针来调用, 和普通函数调用一样, 编译器直接把函数地址插入到调用的地方.
[/Quote]

赞同,这个调用已经和虚函数表没啥关系了。
回复
www_adintr_com 2012-07-11
这个不通过虚函数指针来调用, 和普通函数调用一样, 编译器直接把函数地址插入到调用的地方.
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告