多态说白了就是,父类的指针被赋值子类实例的地址后,可根据需要来调用父类或子类的函数。
当父类和子类的函数完全相同时:
#include <iostream>
using namespace std ;
class father{
public:
void func(int data){cout<<"class father:"<<data<<endl;}
};//没有virtual
class son: public father{
public:
void func(int data) { cout<<"class son:"<<data<<endl; }
};
int main(){
father *pa;
son b;
pa=&b;
pa->func(1);
return 0;
}
结果为:
#include <iostream>
using namespace std ;
class father{
public:
virtual void func(int data){cout<<"class father:"<<data<<endl;}
};
class son: public father{
public:
void func(int data) { cout<<"class son:"<<data<<endl; }
};
int main(){
father *pa;
son b;
pa=&b;
pa->func(1);
return 0;
}
结果为:
可见,只有当父类函数有virtual时,函数覆盖才成功,多态性才得以实现。
当父类和子类的函数只有名字相同时:
#include <iostream>
using namespace std ;
class father{
public:
virtual void func(){cout<<"class father:"<<endl;}
};
class son: public father{
public:
void func(char data) { cout<<"class son:"<<data<<endl; }
};
int main(){
father *pa;
son b;
pa=&b;
pa->func('a');
return 0;
}
编译错误:
可见,父类指针不能指向子类自己特殊的函数。