先看下面的一到面试题
#ifndef BASE_H
#define BASE_H
#include <iostream>
using namespace std;
class base
{
public:
base();
virtual void print()
{
cout<<"A"<<endl;
}
};
class deride1:public base
{
public:
virtual void print(){
cout<<"B"<<endl;
}
};
class deride2:public base
{
public:
virtual void print()
{
cout<<"c"<<endl;
}
};
#endif // BASE_H
下面是main函数文件的代码
void fun(base base1)
{
base1.print();
}
using namespace std;
int main()
{
base a, *pa,*pb,*pc;
deride1 b;
deride2 c;
a.print();
b.print();
c.print();
pa = &a;
pb = &b;
pc = &c;
pa->print();
pb->print();
pc->print();
fun(a);
fun(b);
fun(c);
结果是 ABC ABC AAA
下面我来仔细分析一下结果在deride1 和deride2 中重写的print函数 会把父类的虚函数给覆盖。
前面三哥是各个对象调用各自的虚函数 因为父类的已经被覆盖。
中间三个是父类指针指向子类对象 满足动态联翩的两个要求 第一 父类的指针或引用调用子类的函数 第二 调用的是虚函数 所以会调子类各自的虚函数。
后面三个是通过子类对象初始化父类对象,满足不了动态联翩。所有还是基类的函数。。。