#include<iostream>
using namespace std;
class A
{
int a;
public:
virtual void fun(){cout<<"调用A::fun()"<<endl;cout<<"a="<<a<<endl;} //如果没有virtual
A(int tmp=111){a = tmp;cout<<"调用A构造函数"<<endl;}
};
class B:public A
{
int b;
public:
void fun()
{
cout<<"调用B::fun()"<<endl;
cout<<"b="<<b<<endl;
}
B(int tmp=2)//:A(tmp)
{
b = tmp;cout<<"调用B构造函数"<<endl;
}
};
int main()
{
B* b=new B();
A *tmpa;
tmpa = b;
tmpa->fun();
//delete a;
delete b;
return 0;
}
编译后运行结果:
[student@SEP4020 testc++]$ ./xxx
调用A构造函数
调用B构造函数
调用B::fun()
b=2
但是如果把类A中的virtual关键字去掉的运行结果:
[student@SEP4020 testc++]$ ./xxx
调用A构造函数
调用B构造函数
调用A::fun()
a=111
由此可知,将派生类对象地址赋值给一个基类指针,由虚函数可实现C++的运行时多态性,尽管调用形式会一样,但是却调用的不同对象中的虚函数