当前位置: 首页 > news >正文

网站开发哪家公司好知名的网络推广

网站开发哪家公司好,知名的网络推广,做网站的企业文化怎么写,企业网站新模式抽象类的定义 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。 抽象类的作用 提供统…

抽象类的定义

  1. 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。
  2. 抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 = 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。

抽象类的作用

  1. 提供统一接口 :抽象类定义了一组接口规范,要求所有派生类都实现这些接口。这样可以确保不同类型的对象具有相同的调用方式,使得代码更加通用和灵活。
  2. 避免重复代码 :通过在抽象类中定义通用的成员函数,派生类可以继承这些函数,从而避免重复实现相同的逻辑。
  3. 支持多态 :抽象类和纯虚函数是实现多态的关键。通过基类指针或引用,可以调用派生类的具体实现,使得程序在运行时能够根据对象的实际类型执行相应的操作。

抽象类的原理

  1. 纯虚函数的实现 :在C++中,纯虚函数是通过在编译时标记为未实现的函数来实现的。编译器会确保所有派生类都必须实现这些纯虚函数,否则派生类也会成为抽象类。
  2. 动态绑定 :当通过基类指针或引用来调用虚函数时,编译器会生成代码来动态决定调用哪个派生类的函数实现。这是通过虚函数表(vtable)和虚表指针(vpointer)来实现的。
  3. 虚函数表(vtable :每个类都有一个虚函数表,它是一个包含类中所有虚函数地址的数组。当创建一个派生类的对象时,其虚表指针会指向派生类的虚函数表。
  4. 虚表指针(vpointer :每个包含虚函数的类的对象都有一个隐藏的指针,称为虚表指针,它指向该类的虚函数表。当通过基类指针调用虚函数时,编译器会通过虚表指针查找并调用相应的函数实现。

示例代码

#include <iostream>
using namespace std;class Abstract
{
public:virtual void display() = 0; // pure virtual functionAbstract(){cout << "Constructor of Abstract class" << endl;}virtual ~Abstract(){cout << "Destructor of Abstract class" << endl;}
};class Derived : public Abstract
{
public:void display(){cout << "Display function of Derived class" << endl;}Derived(){       cout << "Constructor of Derived class" << endl;}~Derived(){cout << "Destructor of Derived class" << endl;}
};void call(Abstract *obj)
{obj->display();
}int main()
{Derived d;call(&d);return 0;
}

在这里插入图片描述

为什么构造函数不能被声明为虚函数?

在这里插入图片描述
构造函数是给对象分配内存和初始化成员变量的,编译器要提前知道调用哪个构造函数,才能准确地分配内存和初始化。
就好比造汽车,必须先确定用哪个模具(构造函数),才能准备好材料和工具(分配内存)并开始组装(初始化成员变量)。

构造函数不是用来实现运行时多态的,它是为了确保对象在创建时就处于一个有效的初始状态。虚函数机制用于支持运行时多态,是通过虚函数表(vtable)和虚表指针(vpointer)实现的。

C++中,创建派生类对象时,基类构造函数先执行,接着才是派生类构造函数。假若构造函数被设为虚函数,那在基类构造函数运行时,派生类构造函数还没执行,对象的动态类型尚未确定,编译器就无法知晓该调用哪个构造函数。

另外,虚函数表的初始化是在对象构造过程中完成的。在构造函数执行前,虚函数表指针(vpointer)尚未初始化。若构造函数是虚函数,调用时虚函数表指针未设置好,就无法确定具体调用哪个构造函数。所以,构造函数不能是虚函数。

正是因为构造函数的调用必须在编译时确定,而虚函数机制依赖于运行时的动态绑定,所以构造函数不能是虚函数。这样的设计确保了对象能够正确初始化,并且构造过程是可预测的。

虚函数表(vtable)的初始化主要发生在哪些阶段?

1. 编译阶段,为每个包含虚函数的类生成虚函数表

虚函数表是一个包含该类所有虚函数地址的数组。

编译器会根据类的定义和继承关系来构建这个表。

对于派生类,其虚函数表会包含基类的虚函数和派生类自己的虚函数,如果派生类重写了基类的虚函数,则虚函数表中将使用派生类的实现覆盖基类的实现。

2. 对象构造阶段,为每个创建的对象分配虚表指针(vpointer

虚表指针(vpointer)指向该对象对应的虚函数表。

这个指针的初始化发生在对象的构造函数执行之前。

具体来说,基类构造函数首先执行,在基类构造函数中,对象的虚表指针被初始化为基类的虚函数表。当派生类构造函数执行时,虚表指针会被更新为派生类的虚函数表。

3. 动态绑定阶段,通过虚表指针查找对应函数

在对象的生命周期中,虚表指针始终指向该对象对应的虚函数表。

当调用虚函数时,编译器会通过虚表指针查找并调用相应的函数。

如果对象的类型在运行时发生变化(例如,通过多态),虚表指针会指向不同的虚函数表,从而实现动态绑定。

4. 总结

虚函数表的初始化主要在编译阶段和对象构造阶段完成。

编译器在编译时为每个类生成虚函数表,在对象构造时为对象的虚表指针赋值。

虚函数表的初始化确保了在调用虚函数时能够正确地找到对应的函数实现,支持运行时的多态行为。

纯虚函数和虚函数的区别

在这里插入图片描述
纯虚函数 :在函数声明后面加上 = 0,表示该函数没有具体实现,必须由派生类来实现。包含纯虚函数的类是抽象类,不能被实例化。
虚函数 :普通的虚函数有具体实现,可以在基类中定义,派生类可以重写也可以不重写。如果派生类不重写,将继承基类的实现。

两者都用于实现运行时多态性,但纯虚函数强制派生类必须提供实现,而虚函数允许派生类选择是否重写。

包含纯虚函数的类是抽象类,不能实例化;而包含虚函数的类可以是具体类,可以实例化。

调用 call(&d) 时,对象的创建和销毁过程

在这里插入图片描述

1. 对象创建过程

当执行 Derived d; 时:

  1. 分配内存 :为 Derived 类对象 d 分配内存,包括基类 Abstract 的成员和派生类 Derived 的成员。
  2. 调用基类构造函数 :首先调用基类 Abstract 的构造函数 Abstract(),初始化基类的部分。
  3. 调用派生类构造函数 :然后调用派生类 Derived 的构造函数 Derived(),初始化派生类的部分。

执行顺序如下:

Constructor of Abstract class
Constructor of Derived class

2. 调用 call(&d)

当执行 call(&d); 时:

  1. 传递指针 :将 d 的地址传递给 call 函数,函数参数 obj 是一个指向 Abstract 类的指针。
  2. 动态绑定 :在 call 函数内部,通过 obj->display(); 调用 display() 函数。由于 display() 是纯虚函数,编译器会根据 obj 实际指向的对象类型(这里是 Derived 类),动态绑定到 Derived 类的 display() 实现。
  3. 执行派生类函数 :调用 Derived 类的 display() 函数,输出 Display function of Derived class

3. 对象销毁过程

main 函数结束时,对象 d 的生命周期结束,执行以下步骤:

  1. 调用派生类析构函数 :首先调用派生类 Derived 的析构函数 ~Derived()
  2. 调用基类析构函数 :然后调用基类 Abstract 的析构函数 ~Abstract()

执行顺序如下:

Destructor of Derived class
Destructor of Abstract class

虚析构函数的定义

析构函数是用来在对象生命周期结束时释放资源的特殊成员函数。

当基类的析构函数被声明为虚函数时,它就被称为虚析构函数。

虚析构函数的作用

C++中,当你用基类指针去删除派生类对象时,如果没有虚析构函数,就只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源(比如内存、文件句柄等)没有被正确释放,从而造成内存泄漏或其他资源未释放的问题。

虚析构函数通过动态绑定机制,确保在这种情况下,程序会正确调用派生类的析构函数,然后再调用基类的析构函数。这样就保证了所有相关的资源都能被正确释放。

虚析构函数通过动态绑定机制确保在通过基类指针删除派生类对象时,会正确调用派生类的析构函数。

推荐一下

https://github.com/0voice

http://www.cadmedia.cn/news/12958.html

相关文章:

  • 平面设计类的网站百度seo关键词排名查询
  • 餐饮品牌网站建设在线刷高质量外链
  • 广州网站设计找哪里游戏推广公司靠谱吗
  • 数据网站建设哪个好百度在线扫题入口
  • 怎样建设自己的ip地址网站一般网站推广要多少钱
  • 天翼云主机怎么建设网站百度点击排名收费软件
  • 淮南公司网站建设浙江网站建设平台
  • 建设网站的收费b站推广入口2023mmm
  • 网站建设开发多少钱他达那非副作用太强了
  • 私人找人做网站网站关键词优化排名推荐
  • 湖北移动网站建设seo如何进行优化
  • 网站建设 太原友情链接系统
  • 电子书网站建设乐陵市seo关键词优化
  • 简述网站建设基本流程优化网站推广网站
  • 阿里云外贸建站国内搜索网站排名
  • 上海网站建设报价单数据分析工具
  • 网站建设商业阶段百度app下载最新版
  • 农林网站建设做一个简单网页
  • 隆昌移动网站建设手机百度下载app
  • 北京定制公交网站如何优化网站快速排名
  • 网站建设中网页模板注册一个网站
  • 中跃建设集团网站吗网址域名查询
  • 自己网站建设容易吗腾讯企业邮箱登录入口
  • 建设银行网站为什么登不上去最近新闻头条最新消息
  • 东莞市官网网站建设品牌合肥网络公司排名
  • 泾川县建设局网站跨境电商靠谱吗
  • 电子商务网站排名优化seo是什么意思
  • 文网站建设广告推广系统
  • 网站安全建设需求百度贴吧怎么发广告
  • 网站及微站建设合同百度广告太多