虚函数使用
虚函数:在基类中加了 virtual 关键字的函数就是虚函数。
虚函数原理
虚函数实现原理:虚函数表和虚函数指针。
虚函数和纯虚函数的区别
-
定义一个函数为虚函数,不代表函数为不被实现的函数;定义一个函数为纯虚函数,才代表函数没有被实现。
-
定义为虚函数的目的:为了允许用基类的指针来调用子类的这个函数。
-
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
具体实现代码
理解过程在下面代码注释中:
#include<iostream>
using namespace std;
//基类People
class People
{
public:
virtual void a(float x)
{cout<<"People::a "<<x<<endl;}
void b(float x)
{cout<<"People::b "<<x<<endl;}
void c(float x)
{cout<<"People::c "<<x<<endl;}
};
//派生类Student
class Student:public People
{
public:
virtual void a(float x)
{cout<<"Student::a "<<x<<endl;}
void b(int x)
{cout<<"Student::b "<<x<<endl;}
void c(float x)
{cout<<"Student::c "<<x<<endl;}
};
// 只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用
int main()
{
Student d;
People *people=&d; // p基类指针,p的函数调用如果有virtual
// 如果没有virtual,是正常的静态函数调用-调用基类的:输出 Peoplexxxx
// 如果有virtual,根据多态性调用派生类的:调用a函数输出 Student xxx
Student *student=&d;
// student派生类指针,s的所有函数调用都只是调用自己的函数,和多态性无关,student的所有函数调用的结果都输出Student::是正常的
people->a(1.45f); // Student::a 1.45 atttention!
student->a(1.45f); // Student::a 1.45
people->b(1.45f); // People::b 1.45
student->b(1.45f); // Student::b 1
people->c(1.45f); // People::c 1.45 atttention!
student->c(1.45f); // Student::c 1.45
return 0;
}