虚函数的问题

Kang_TJU 2017-08-20 08:38:18
小弟这两天看到了一道虚函数的面试题,自己有点迷惑。求大神指教,先把题目放上来。下面这道题目最后输出的结果是调用了A当中的print()函数,也就是说没有发生多态!基类指针,虚函数调用,这两个条件都符合啊?为什么没有触发多台呢?求大神指导
#include <iostream>

class A{
public:
virtual void print( char a ){ std::cout << "A called." << std::endl;
std::cout << a << std::endl;}
};

class B : public A{
public:
virtual void print( int a ){ std::cout << "B called." << std::endl;
std::cout << a << std::endl;}
};

int main( void ){

A* pa = new B();

pa->print( 65 );

delete pa;
return 0;
}
...全文
409 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2017-08-22
  • 打赏
  • 举报
回复
引用 6 楼 Kang_TJU 的回复:
[quote=引用 1 楼 sinat_35261315 的回复:] 多态中的虚函数要求函数格式完全相同,代码中不相同,所以构不成多态 pa是基类指针,调用非多态的虚函数只能在基类作用域中进行函数查找
有个问题得先说清楚,什么叫非多态的虚函数?对这个概念不是很理解。说下自己的理解,多态作为一种oo特性,语言层面有虚函数支持,对象模型有vptr+vtable支持。所以,我认为多态和虚函数在逻辑上不在一个层面。 当派生类重写基类的虚函数时,派生类的vtable当中,基类的虚函数被替换成派生类的虚函数,这是多态的根本原因。如果没有发生重写,基类的虚函数和派生类的虚函数都存在于派生类的vtable当中。 我的问题是,既然他们都存在与派生类的vtable当中,为什么调用个基类的虚函数,因为从函数标签上来说,应该匹配派生类的虚函数才对。[/quote] 你也知道“派生类的vtable当中,基类的虚函数被替换成派生类的虚函数,这是多态的根本原因”这个道理不是? 也知道“如果没有发生重写,基类的虚函数和派生类的虚函数都存在于派生类的vtable当中”。 vtable存的是函数指针,又没有函数类型。 你告诉我一下基类如何能找到派生类的其它虚函数地址在哪里? 所谓的函数标签,不过是常量值类型能够隐式转换而已。
  • 打赏
  • 举报
回复
引用 6 楼 Kang_TJU的回复:
[quote=引用 1 楼 sinat_35261315 的回复:] 多态中的虚函数要求函数格式完全相同,代码中不相同,所以构不成多态 pa是基类指针,调用非多态的虚函数只能在基类作用域中进行函数查找
有个问题得先说清楚,什么叫非多态的虚函数?对这个概念不是很理解。说下自己的理解,多态作为一种oo特性,语言层面有虚函数支持,对象模型有vptr+vtable支持。所以,我认为多态和虚函数在逻辑上不在一个层面。 当派生类重写基类的虚函数时,派生类的vtable当中,基类的虚函数被替换成派生类的虚函数,这是多态的根本原因。如果没有发生重写,基类的虚函数和派生类的虚函数都存在于派生类的vtable当中。 我的问题是,既然他们都存在与派生类的vtable当中,为什么调用个基类的虚函数,因为从函数标签上来说,应该匹配派生类的虚函数才对。[/quote] 个人理解基类的指针要在基类的虚函数表中进行函数查找,之所以存在多态,是基类的虚函数表中的同标签函数被覆盖,和派生类的虚函数表无关。
Kang_TJU 2017-08-22
  • 打赏
  • 举报
回复
引用 1 楼 sinat_35261315 的回复:
多态中的虚函数要求函数格式完全相同,代码中不相同,所以构不成多态 pa是基类指针,调用非多态的虚函数只能在基类作用域中进行函数查找
有个问题得先说清楚,什么叫非多态的虚函数?对这个概念不是很理解。说下自己的理解,多态作为一种oo特性,语言层面有虚函数支持,对象模型有vptr+vtable支持。所以,我认为多态和虚函数在逻辑上不在一个层面。 当派生类重写基类的虚函数时,派生类的vtable当中,基类的虚函数被替换成派生类的虚函数,这是多态的根本原因。如果没有发生重写,基类的虚函数和派生类的虚函数都存在于派生类的vtable当中。 我的问题是,既然他们都存在与派生类的vtable当中,为什么调用个基类的虚函数,因为从函数标签上来说,应该匹配派生类的虚函数才对。
sdghchj 2017-08-21
  • 打赏
  • 举报
回复
这个叫函数隐藏,不叫函数覆盖。
jena_wy 2017-08-21
  • 打赏
  • 举报
回复
一个是print( int a ),一个是print( char a ),两个完全没有关系,没有重写
黑娃 2017-08-21
  • 打赏
  • 举报
回复
引用 1 楼 sinat_35261315 的回复:
多态中的虚函数要求函数格式完全相同,代码中不相同,所以构不成多态 pa是基类指针,调用非多态的虚函数只能在基类作用域中进行函数查找
+1 补充一点,A的入参也可以接收一个字节的整形数字
trytry1992 2017-08-21
  • 打赏
  • 举报
回复
你需要C++11 新关键字 override
  • 打赏
  • 举报
回复
多态中的虚函数要求函数格式完全相同,代码中不相同,所以构不成多态 pa是基类指针,调用非多态的虚函数只能在基类作用域中进行函数查找

64,688

社区成员

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

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