虚函数可以实现通过基类指针访问派生类的函数
class base {
public:
virtual void fun1(); //用virtual声明为虚函数
virtual void fun2(); //用virtual声明为虚函数
virtual void fun3(); //用virtual声明为虚函数
};
class derived :public base{
public:
virtual void fun1(); //虚函数 virtual可以省略不写
virtual void fun2(int a);//格式改变,普通函数重载
// char fun3(); //只改变函数返回类型,错误,因为重载以不能只改变返回类型
};
在基类的函数前面加上virtual变为虚函数,派生类中可以进行重写,来实现不同的功能,重写时声明格式不能改变,要保持完全一致,如果改变就变为普通的函数重载
虚函数的定义与普通类函数定义相同,前面不加virtual
//函数定义
void base::fun1(){
cout <<"base::fun1"<< endl;
}
void base::fun2() {
cout << "base::fun2" << endl;
}
void derived::fun1() {
cout << "defived::fun1" << endl;
}
void derived::fun2(int a) {
cout << "defived::fun2" << endl;
}
//调用
int main() {
base b, *bp;
derived c;
bp = &c; //这是基类指针,指向了它的派生类
bp->fun1(); //通过指针指向了派生类的虚函数
bp->fun2(); //没有重写,调用继承下来的
// bp->fun2(11); //错误,重载的不能用基类指针访问,重载的函数在派生类中,这就是虚函数的功能
}
结果
defived::fun1
base::fun2
虚函数的作用就是让函数可以用基类指针访问其他派生类中重写的函数
纯虚函数是在基类中虚函数不进行定义,在声明后面加上=0
class base {
public:
virtual void fun()=0; //纯虚函数
};
class derived:public base{ //派生类
void fun(){ //定义函数
cout<<"derived::fun"<<endl;
}
int main(){
base *a; //抽象类只能用来声明指针
derived b;
a=&b; //基类指针指向派生类
a->fun(); //通过基类指针调用派生类的虚函数
}
如果一个类有纯虚函数,称为抽象类,抽象类只能作为基类使用,不能用来建立抽象类对象,不能用做参数类型,函数返回值或显式转换类型。但可以用来声明指针和引用,指向派生类;
简单说只能声明指针
如果在派生类中纯虚函数还没有被定义,那么这个类也还是抽象类,该函数在该类中还是一个纯虚函数,