#include <iostream>
#include <cstdio>
using namespace std;
class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fuu()
{
printf("2\n");
}
};
class B:public A
{
public :
void foo()
{
printf("3\n");
}
void fuu()
{
printf("4\n");
}
};
int main()
{
A a;
B b;
A *p = &a;//p是基类指针,指向基类对象
cout<< "p->foo()---" ; p->foo() ;
cout<<"p->fuu()---";p->fuu(); //调用基类a本身的函数,因此输出结果为2
cout <<"-------向上转型-----------"<<endl;
p=&b;//基类指针指向子类对象,正式体现多态的用法,
cout<<"p->foo()---";p->foo(); //因为指针p是个基类指针,因此此时指向的只能是基类的foo()函数代码了,因此输出结果还是1
cout<<"p->fuu()---";p->fuu(); // 指针p是个基类指针,但指向的fuu是一个虚函数,由于每个虚函数都有一个虚函数列表,此时p调用fuu()并不是直接调用函数,而是通过虚函数列表找到相应的函数的地址,
//因为现在p指向了子类b的地址,这里将找到对应的子类b的fuu()函数的地址,因此输出的结果也会是子类的结果4.
cout <<"--------向下转型----------"<<endl;
B *ptr =(B *)&a;//(B *)强制转化为B型指针
//B *ptr =&a;//这种写法是错误的,因为指针ptr是B类性的,地址a所指向的是A类的地址,两个类型不一样,
cout<<"ptr->foo()----";ptr->foo();//ptr是B类指针,foo()是一般的函数,所以仍然指向子类B中的函数,输出为3
cout<<"ptr->fuu()-----";ptr->fuu();//尽管ptr是B类指针,但因为fuu()是纯虚函数,所以指向了地址A的fuu函数,输出为2
return 0;
}
运行结果
小结:1.有virtual才可能发生多态现象2.不发生多态(无virtual)调用就按原类型调用