艾巴生活网

您现在的位置是:主页>科技 >内容

科技

简述虚函数的使用方法_一文详解虚函数及其相关知识点

2024-03-14 22:02:01科技帅气的蚂蚁
这一期是C基础语法分享的第七节,今天就和大家分享一下:(1)虚拟析构函数;(2)纯虚函数;(3)虚函数和纯虚函数;(4)虚函数指针和虚函数表;(

简述虚函数的使用方法_一文详解虚函数及其相关知识点

这一期是C基础语法分享的第七节,今天就和大家分享一下:

(1)虚拟析构函数;

(2)纯虚函数;

(3)虚函数和纯虚函数;

(4)虚函数指针和虚函数表;

(5)虚拟继承;

(6)虚拟继承和虚拟功能;

(7)模板类、成员模板和虚函数;

(8)抽象类、接口类、聚合类;

虚拟析构函数

虚析构函数就是解决基类的指针指向派生类对象的问题,用基类的指针删除派生类对象。

虚拟析构函数的使用

类Shape { public:Shape();//构造函数不能是虚函数virtual double calcArea();虚拟~ Shape();//虚拟析构函数};class circle:public shape//circular class { public:virtual double calcarea();};int main(){ Shape * Shape 1=new Circle(4.0);shape 1-》calcArea();删除shape1//因为Shape有一个虚析构函数,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。shape1=NULL返回0;}

纯虚函数

纯虚函数是一种特殊的虚函数。在基类中,虚函数不能被赋予有意义的实现,但它被声明为纯虚函数,其实现留给基类的派生类。

虚拟int A()=0;

虚函数,纯虚函数

如果在一个类中声明了一个虚函数,那么即使它是空的,也会被实现。它的作用是使函数在其子类中被覆盖,这样编译器就可以使用后期绑定来实现多态性。纯虚函数只是一个接口,一个函数的声明,应该留给子类来实现。

虚函数不能在子类中重写;但是纯虚函数必须在子类中实现,子类才能实例化。

虚函数的类用于“实现继承”,继承父类的接口和实现。纯虚函数注重接口的统一性,实现由子类完成。

具有纯虚函数的类称为抽象类,抽象类不能直接生成对象,只有被继承并重写其虚函数后才能使用。抽象类被继承后,子类可以继续是抽象类或者普通类。

虚拟基类是虚拟继承中的基类,暂时不详细解释。

虚函数指针、虚函数表

虚函数指针:在包含虚函数类的对象中,指向虚函数表,在运行时确定。

虚函数表:在程序的只读数据段,存储虚函数指针。如果派生类实现了基类的虚函数,那么在根据编译时类的声明创建的虚拟表中,原始基类的虚函数指针将被覆盖。

虚拟继承

虚拟继承用于解决多重继承(浪费存储空间,有歧义)情况下的钻石继承问题。

底层实现原理与编译器有关,一般通过虚拟基类指针和虚拟基类表来实现。每个虚拟继承的子类都有一个虚拟基类指针(占用一个指针的存储空间,4个字节)和一个虚拟基类表(不占用类对象的存储空间)(需要强调的是,虚拟基类在子类中还是会被复制,但最多只有一个副本,不会出子类);当虚拟继承的子类作为父类被继承时,虚拟基类指针也被继承。

其实vbptr指的是一个虚拟基表指针,指向一个虚拟基表,里面记录了虚拟基类和这个类的偏移地址;通过移位地址找到虚拟基类成员,虚拟继承不需要像普通多继承一样维护两个相同的公共基类(虚拟基类)副本,节省存储空间。

虚拟继承、虚拟函数

相似之处:两者都使用虚拟指针(占用类的存储空间)和虚拟表(不占用类的存储空间)。

差异:

虚拟继承

(1)虚拟基类仍然存在于继承的类中,只占用存储空间。

(2)虚拟基类表存储虚拟基类从directl的偏移

(2)虚函数表存储虚函数地址。

模板类、成员模板、虚函数

模板类中可以使用虚函数。

一个类(不管是普通类还是类模板)的成员模板(本身就是模板的成员函数)不能是虚函数。

抽象类、接口类、聚合类

抽象类:包含纯虚函数的类

接口类:只包含纯虚函数的抽象类。

聚合类:用户可以直接访问它的成员,并有一个特殊的初始化语法。满足以下特征:

(1)所有成员都是公开的。

(2)没有定义构造函数。

(3)没有课内初始化

(4)没有基类,没有虚函数。

今天的分享到此结束。大家都要学C哟~

japan quarterly 日本季刊