什么是虚函数?
那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
虚函数声明如下:virtual ReturnType FunctionName(Parameter);
虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol "public: virtual void __thiscall
ClassName::virtualFunctionName(void)"
什么是纯虚函数?
纯虚函数是一种特殊的虚函数,在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决这个问题,方便使用类的多态性,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象
基类中的函数一定要声明virtual才是虚的,在某个虚函数的第一个声明所在的那个类里,该函数必须予以实现(除非它被声明为纯虚函数)。如它被声明为纯虚函数,继承它的类必须予以实现。虚函数、纯虚函数的区别在于虚函数在本类要实现,纯虚函数不用。但有纯虚函数的类不能实例化,只能作为指针使用。
在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
注记:虚函数的作用是实现多态性(polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略。虚函数联系到多态,多态联系到继承。
纯虚函数是一种特殊的虚函数,它的一般格式如下:
凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务,除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
为了方便使用多态特性,我们常常需要在基类中定义虚函数。
多态性
指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
#include<iostream>
using namespace std;
class Base//基类,抽象类
{
public:
/*
Base(float speed,int total) //构造函数
{
this->speed = speed;
this->total = total;
}
*/
virtual void foo()
{
cout << "Base foo" << endl;
}
virtual void func() = 0;//纯虚函数,纯虚函数不能实例化。在普通的虚函数后面加上"=0"这样就声明了一个pure virtual function.
//类的一个成员定位虚函数的实际意义在于让C++知道该函数并无意义,它的作用只是为了让派生类进行函数重载保留位置。
void test()//非虚成员函数
{
cout << "A" << endl;
}
/*
protected:
float speed;
int total;
*/
};
class Derived :public Base
{
public:
void func() override
{
cout << "哈哈" << endl;
}
void foo()
{
cout<<"derived foo"<<endl;
}
};
int main()
{
Base *b = new Derived();
b->func();//输出:哈哈
b->foo();//输出:derived foo
Base *pa = nullptr;//基类指针,指
pa->test();//此时指针指向Base类的非虚成员函数test,因此输出:A,
//pa->foo();//这样调用是错误的
/*
Derived d;
pa=&d;
cout<<"ptr->fuu()-----";
pa->foo;
*/
return 0;
}
总结: