[C++] 虚函数、纯虚函数、类虚继承
1. 虚函数
1)定义类时,在成员函数前面加上virtual修饰符,可以让这个函数成为虚函数。
2)虚函数需要在基类中有实现。否则就仅仅只是一个函数声明,而无法被继承(无论子类是否覆盖它)。
3)虚函数的作用是使得程序员可以使用基类的指针(或引用)调用子类方法,是多态的一种表现。
4)同函数名的函数可以有一部分是虚函数,其余不是。
5)只要基类的函数被声明为虚函数,子类的函数也为虚函数,即使进行了覆盖。
6)析构函数可以是虚函数,但不应是纯虚函数。当使用基类指针调用子类实例时,让析构函数成为虚函数是必要的。(否则无法调用子类析构函数)
7)友元函数并非类的成员函数,因此不能是虚函数。但可以通过让友元函数调用虚成员函数的方法实现类似于虚友元函数的机制。
2.纯虚函数
1)在虚函数声明后加上 =0,即为一个纯虚函数声明。
2)纯虚函数不能有函数实现,它必须由子类继承并实现。
3)有纯虚函数的类只能作为基类(被继承),而不能被实例化。(类似于Java的接口或者抽象类)
3.虚函数实现方式
1)在有虚函数的类中(包括继承得到虚函数的子类),编译器会埋入一个隐藏的虚函数表指针,它指向的虚函数表中包含了本类所有虚函数的信息(函数正文地址等)。
2)虚函数指针总是被保存在对象的地址首位,以确保运行速度。
3)虚函数在运行时才动态加载进虚函数表。因此编译器无法在编译期预见到虚函数的状态。这样在运行时会造成性能损耗。(需要查找虚函数表来调用函数)
4)每一个类共用一张虚函数表。因此使用作用域可以访问到被覆盖的基类虚函数。
4.类虚继承
1)声明类类型时,在继承的类名前加上virtual,即可进行虚继承。
2)虚继承实现机制与虚函数类似,即将虚继承基类的成员以函数表/成员表的形式保存。
3)菱形继承等情况下需要使用虚继承,可以防止重复继承同一个祖先基类的成员。
4)执行构造函数时,虚基类的构造函数总是先执行,而析构函数总是后执行。
浙公网安备 33010602011771号