虚函数来实现动态绑定
虚函数必须有自己的函数体,且希望被子类的函数覆写,并且用来实现动态绑定。
动态绑定的2个要素:
1. 指定了虚函数的成员函数
2. 必须通过基类类型的引用或者指针进行函数调用。
引用与指针的动态与静态类型可以不同,C++多态的基石。
如果成员函数为非虚函数,哪怕子类中定义了相同的父类函数,调用的还是子类的成员函数。
举例说明:
#include<iostream>
using namespace std;
class A{
public:
void fun(){
cout<<"A"<<endl;
};
};
class B:public A{
public:
void fun(){
cout<<"B"<<endl;
}
};
int main(){
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->fun();
p2->fun();
}
输出为:A
A
如果基类中定义fun为virtual,则表示可以实现动态绑定,且通过基类指针进行函数调用
举例说明
#include<iostream>
using namespace std;
class A{
public:
virtual void fun(){
cout<<"A"<<endl;
};
};
class B:public A{
public:
void fun(){
cout<<"B"<<endl;
}
};
int main(){
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->fun();
p2->fun();
}
输出:A
B
纯虚函数
#include<iostream>
using namespace std;
class A{
public:
virtual void fun()=0;
// cout<<"A"<<endl;
// };
};
class B:public A{
public:
void fun(){
cout<<"B"<<endl;
}
};
int main(){
B b;
A* p2=&b;
p2->fun();
}
输出:B
不能创建A的对象,否则发生编译时的报错。
含有一个或者多个纯虚函数的类叫做抽象基类。