看一下~快看一下~为什么啊?一个c++简单策划程序!!在线等~~

来源:百度知道 编辑:UC知道 时间:2024/05/28 19:36:21
#include<iostream>
using namespace std;
class base
{
public:
virtual void who(){cout<<"base class"<<endl;}
};
class derived1:public base
{
public:
void who(){cout<<"derived1 class"<<endl;}
};
class derived2:public base
{
public:
void who(){cout<<"derived2 class"<<endl;}
};
void main()
{
base obj1, *p;
derived1 obj2;
derived2 obj3;
p=&obj1; p->who();
p=&obj2; p->who();
p=&obj3; p->who();
}
输出的结果为什么是:base class
derived1 class
derived2 class
为什么不是: base class
base class
derived1 class
base class
derived2 class
不是有继承吗?这里哪一个输出有多态啊?为什么 啊?

虚函数是多态性的重要方面,当使用基类的指针指向派生类的对象来访问一个虚函数时访问的就是不同派生类的函数.
上面 p是基类指针,它分别指向了两个派生类的指针,由于调用的是虚函数所以访问的是两个派生类的重写了以后的函数.
这就是运行过程的多态,动态绑定.

简单的讲就是:derived1和derived2继承了base并重写了虚函数who().虚函数多态的实现是通过虚函数表来实现的。重写who()的时候,继承类虚函数表里面的who函数入口地址与父类base里面who()的起始位置一样。当把derived1的对象obj2赋值给base类型的指针p的时候,子类的who()相当于覆盖了父类的who(),所以p=&obj2; p->who(); 这句话实际上执行的是obj2的who()函数,用这个方法实现了多态。
貌似有点乱...呵呵

就一句话,其他看书:
注意:多态不是函数重载