如果希望通过 p 指针访问 Student 类的成员函数,可以将该成员函数声明为虚函数,请看下面的代码:
- #include <iostream>
- using namespace std;
- class People{
- protected:
- char *name;
- public:
- People(char *name):name(name){}
- //加virtual关键字声明为虚函数
- virtual void display(){ cout<<"People: "<<name<<endl;}
- };
- class Student: public People{
- public:
- Student(char *name):People(name){}
- //加virtual关键字声明为虚函数
- virtual void display(){ cout<<"Student: "<<name<<endl;}
- };
- int main(){
- People *p = new People("Xiao Ming");
- p->display();
- p = new Student("Li Lei");
- p->display();
- return 0;
- }
People: Xiao Ming
Student: Li Lei
这段代码仅仅是在 display() 函数声明前加了一个 virtual 关键字,将成员函数声明为了 虚函数(Virtual Function) 。这样,就可以通过 p 指针调用 Student 类的成员函数了,运行结果也证明了这一点。
借助虚函数,基类指针既可以使用基类的成员函数,也可以使用派生类的成员函数,它有多种形态,或多种表现方式,这就是多态(Polymorphism)。
构成多态的条件
多态存在的三个条件:
必须存在继承关系;
继承关系中必须有同名的虚函数,并且它们是覆盖关系(重载不行)。
存在基类的指针,通过该指针调用虚函数。
然后是虚函数,它的特点有:
1.虚函数不能和重载函数一样,进行修改它的参数,返回类型。
2。虚函数只能和定义的类型,返回值类型一模一样。
它具有关键词 virtual 还有一个纯虚函数 它的定义列如:virtual void main ()=0;而且虚函数对于多态具有决定性的作用,有虚函数才能构成多态。