简介:
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
虚函数:
在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。
class Base { public: virtual void print(void) { //... } }; class Derived : public Base { public: virtual void print(void) { //... } };
PS:
1、当类中声明虚函数时,编译器会在类中生成一个虚函数表。
2、虚函数表是一个存储类成员函数指针的数据结构。
3、虚函数表是由编译器自动生成与维护的。
4、virtual成员函数会被编译器放入虚函数表中。
5、当存在虚函数时,每个对象中都有一个指向虚函数表的vfptr指针。
6、vfptr指针一般作为类对象的第一个成员 。
7、使用VS开发人员命令提示可以查看内存布局和虚函数表。
cl /d1 reportSingleClassLayout类名 CPP文件名
纯虚函数:
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。起到定义接口的作用。
class Base { public: virtual void print(void) = 0; };
虚析构函数:
通过基类指针析构所以派生类的资源。如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针只会释放基类申请的内存。
class Base { public: virtual ~Base() { } };
Demo:
#include <iostream> using namespace std; class Base { public: Base() { cout << "Base构造函数" << endl; } virtual ~Base() { cout << "Base析构函数" << endl; } virtual void print(void) { cout << "Base" << endl; } }; class Derived : public Base { public: Derived() { cout << "Derived构造函数" << endl; } ~Derived() { cout << "~Derived析构函数" << endl; } virtual void print(void) { cout << "Derived" << endl; } }; void show(Base *pb) { pb->print(); } int main() { Base *pb = new Base; show(pb); //输出Base delete pb; Base *pd = new Derived; show(pd); //输出Derived delete pd; system("pause"); return 0; }