虚函数的一个问题,高手帮忙解释下

来源:百度知道 编辑:UC知道 时间:2024/05/07 07:58:33
#include<iostream>
#include<queue>
using namespace std;
class A {
public:
virtual void func(A& ra) {printf("Af\n");}
virtual void fun2() {printf("Af2\n");}
};
class B : public A {
public:
virtual void func(B& rb) {printf("Bf\n");}
virtual void fun2() {printf("Bf2\n");}
};

int main()
{
B b;
A &a = b;
a.func(b);
a.fun2();
/* printf("The file name: %s\n", __TIME__);
printf("The file name: %s\n", __DATE__);
printf("The file name: %s\n", __FILE__);
printf("The current line No:%d\n", __LINE__);
int a=10,b=9;
int x1=((((long)((b)-(a)))&0x8fffffff)?-1:0);
int x2=((((long)((a)-(b)))&0x8fffffff)?1:0);
cout<<COMPARE(a,b);
*/ return 0;
}

/*输出结果
Af
Bf2
*/

这应该与引用有关,不仅仅只是虚函数。
关于引用的实现细节
1. 首先作必要的类型转换;
2. 然后将结果置于临时变量;
3. 把临时变量的地址作为初始化的值(引用的值)。
具体地,对于A &a = b;语句,有:
A tempA;
tempA = b;(语义上的,语法上可能通不过编译器,但这句显然会把派生类的内存模型截断,而成为基类)
A &a = &tempA;
所以,
对于a.func(b);调用的是B的func,但输入的参数类型已成为A的引用,而派生类也继承了基类的func函数,由函数重载可得,调用的是A的func。
对于a.fun2();调用的是B的fun2,原因是它覆盖了A的fun2,也就是所谓的虚函数的调用模式。
终上所述,会得出正常的打印结果。
我下午就面试,呵呵,祝你也成功!