首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++

如果一个派生有多个直接基,而这些直接基又有一个共同的基,则在最终的派生中会保留该间接共同基数据成员的多份同名成员。C++提供的方法,使得在继承间接共同基时只保留一份成员。...现在,将A声明为,方法如下: class A//声明基A {…}; class B :virtual public A//声明B是A的公用派生,A是B的 {…}; class...C :virtual public A//声明C是A的公用派生,A是C的 {…}; 注意: 并不是在声明基时声明的,而是在声明派生时,指定继承方式时声明的。...因为一个基可以在生成一个派生时作为,而在生成另一个派生时不作为。...下面我们把A改成再看看结果。

1.1K20

抽象函数与析构

函数,一般是在设计一个基时使用的,它将接口函数设置为纯函数后,只提供子类去继承并实现,以形成多态,除此以外不提供任何其他功能,我们称这种类为抽象(abstract)。...【纯函数的声明语法】 virtual 函数声明 = 0; 【纯函数的特征】 1、只有声明,没有实现代码。 2、含有纯函数的称为抽象(abstract)。不能被实例化,只能被继承。...3、继承抽象的意义就是提供族类的公共接口。 4、子类继承的纯函数,如果未实现,子类仍然为抽象,仍然不能被实例化。 【函数的若干限制】 1、只有的成员函数才能声明为函数。...函数仅适用于有继承关系的对象,所以普通函数不能声明为函数。 2、静态成员函数不能是函数静态成员函数不受对象的捆绑,只有的信息。 3、内联函数不能是函数。...// Shape s; // 子类若未实现父函数,那么这个也是抽象,不能被实例化 // Rect r; // 使用子类对象初始化父对象指针,构成多态 Shape *s = new Circle

16530
您找到你想要的搜索结果了吗?
是的
没有找到

派生多态函数?

任何构造函数之外的非静态函数都可以是函数。 关键字virtual只能出现在内部的声明语句之前而不能用于外部的函数定义。 如果基把一个函数声明成函数,则该函数在派生中也是函数。...此外,我们能将公有派生类型的对象绑定到基的引用或指针上。 大多数都只继承自一个,这种形式的继承被称作“单继承”。 派生中的函数派生类经常(但不总是)覆盖它继承的函数。...如果派生没有覆盖其基中的某个函数,则该函数的行为类似于其他的普通成员,派生会直接继承其在基中的版本,派生可以在它覆盖的函数前使用virtual关键字,但不是非得这么做(可有可无)。...1.析构与纯析构共性: 解决父指针释放子类对象不干净问题 都需要有具体的函数实现 2.区别: 如果是纯析构,该类属于抽象,无法实例化 .析构语法: virtual ~名(){}...纯析构语法: virtual ~名()=0; 名::~名(){} 纯虚数 子类的内容会覆盖父,所以父中函数没有意义了 中只要有一个纯函数就称为抽象 virtual void

13820

【Example】C++ 继承 (菱形继承问题)

这时,Base 便成了 Byte 和 Expert 的,达成了继承的方式,Base 在最终的 Blu 中只存在一个,所以不存在命名空间冲突及资源浪费。...并不是“绝对的”,而是“相对的”:在它自身声明、定义的时候无需任何修饰,只是在子类继承时进行 virtual 修饰。...同时,在继承机制当中,是由最终的派生进行初始化的,本身达成了一种 “间接继承” 的关系。 也就意味着最终的派生在构造函数初始化中,要在初始化表中调用的构造函数进行初始化。...这样,就保证了不会被二次初始化。...privat privat private private 另外,继承概念:【Example】C++ 继承 (菱形继承问题) 继承时,子类的内存结构当中不包含父

87330

()继承的内存占用大小

()继承的内存占用大小 首先,平时所声明的只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。...计算一个对象的大小时的规律:     1、空、单一继承的空、多重继承的空所占空间大小为:1(字节,下同);     2、一个中,函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用对象的存储空间的...;     3、因此一个对象的大小≥所有非静态成员大小的总和;     4、当中声明了函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向函数表VTable...;     5、承继的情况:由于涉及到函数表和基表,会同时增加一个(多重继承下对应多个)vfPtr指针指向函数表vfTable和一个vbPtr指针指向基表vbTable,这两者所占的空间大小为...:8(或8乘以多继承时父的个数);     6、在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;     7、对象的大小=各非静态数据成员

1.5K80

c++继承 基 派生 函数

参考链接: C++继承 继承    的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父中的一些东西,父也称为基,子类也称为派生。派生继承了基除构造函数以外的所有成员。 ...1.调用基的构造函数 2.调用派生的构造函数 派生的析构可想而知: 1.调用派生的析构函数 2.调用基的析构函数  函数  如下程序:  class Base { public:     Base...基中含有函数,那么基布局中存在一个函数指针,指向函数表;且其派生中与其同名同参的函数不需要加virtual也是函数。...vfptr指针指向的vftable(函数表)中,&Base_meta中存放了RTTI信息(运行时类型信息),也就是class Base,0表示偏移,&Base::Show表示函数的入口地址。...首先通过指针所指向的对象找到vfptr,再找到vftable,获取到Show函数的入口地址,此时 &Derive::Show中存放的是派生函数入口地址,因此调用的是派生中的Show()函数。

1K20

【C++】多态 ⑧ ( 验证指向 函数表 的 vptr 指针 | 对比定义了函数的和没有定义函数的大小 )

对比 定义了 函数 的 与 没有定义函数的 的大小 , 其它成员都相同 , 定义了函数的多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 函数表...函数指针 : " 函数表 " 是 存储 " 成员函数指针 " 的 数据结构 , 是一个 函数指针数组 , 数组中的元素都是函数指针 , 具体存储的都是 指向 中的函数 的指针 ; 如果 子类...中 , 重写了 父的 virtual 函数 , 那么 C++ 编译器会在 子类 函数表 中放入该 子类函数的 函数指针 ; 如果 C++ 中存在 virtual 函数 , 在创建对象时 ,...; 2、函数与普通函数对比 - 多出了 vptr 指针的大小 下面的代码中 , 定义了 2 个 , 区别是 一个定义了 virtual 函数 , 另外一个没有定义 函数 ; 在 Parent...判断两个的区别 ; 最终得到 , 有 函数 的 , 比 没有 函数 的 , 多 4 字节 , 也就是一个指针的大小 , 定义了 函数 的 , 多出的 4 字节就是 vptr 指针的大小

17440

菱形继承问题及解决方法—继承与(C++)

二是通过继承的方式,使羊驼仅继承一份数据。...m_Age,通过限定作用域的方式无法彻底解决这个问题,这个时候就要使用继承 继承与 具体实现为在羊和驼的继承前加上virtual关键词,Animal称为 代码如下: #include... using namespace std; class Animal // { public: int m_Age; }; class Sheep :virtual public...Animal{}; //继承 class Tuo :virtual public Animal{}; //继承 class SheepTuo :public Sheep, public Tuo{}...可以看出羊和驼中的数据只是一个指针,并未继承具体的数据,这个指针指向各自的表,而表中存在一个偏移量,通过这个偏移量再加上首地址可以找到基中的数据,所以实际上羊驼只继承了一份数据

97840

C++虚拟继承与

(1)当在多条继承路径上有一个公共的基,在这些路径中的某几条汇合处,这个公共的基就会产生多个实例(或多个副本),若只想保存这个基的一个实例,可以将这个公共基说明为,就像Student和Employee...(2)被虚拟继承的基,叫做实际指的是继承的方式,而非一个基,是动词,而非名词。 (3)为了实现虚拟继承,派生对象的大小会增加4。...这个增加的4个字节,是因为当虚拟继承时,无论是单继承还是多继承,派生需要有一个表来记录继承关系,所以此时子类需要多一个表指针,而且只需要一个即可。...(4)虚拟继承中,对象是由最远派生的构造函数通过调用的构造函数进行初始化的,派生的构造函数的成员初始化列表中必须列出对构造函数的调用;如果未列出,则表示使用该的缺省构造函数。...因为虚拟继承只是表名某个基的对象在派生对象中只被构造一次,而在本例中Student和Employee对象在EGStudent对象中本来就不会被构造多次,所以不将它们申明也是完全可以的。

85320

C++纯函数与抽象

1.2析构函数 在的继承中,基的析构函数一般都是函数。当基中有函数的时候,析构函数也要定义为析构函数。...一般情况下,如果类中没有函数,就不用去声明析构函数。当且仅当里包含至少一个函数的时候才去声明析构函数。只有当一个被用来作为基的时候,才有必要将析构函数写成函数。...编译器会为每个有函数的创建一个函数表,该函数表将被该类的所有对象共享,的每个函数成员占据函数表中的一行。 在这个表中,存放的是一个函数的地址。...而含有至少一个纯函数的被称为抽象。定义纯函数和抽象的目的在于,仅仅只定义派生继承的接口,而暂时无法提供一个合理的缺省实现。...实现了基Base函数和纯函数,同时注意到,企图去实例化抽象,编译器会报错。

1.4K20

从零开始学C++之函数与多态(二):纯函数、抽象析构函数

一、纯函数 函数是实现多态性的前提 需要在基中定义共同的接口 接口要定义为函数 如果基的接口没办法实现怎么办?...如形状Shape 解决方法 将这些接口定义为纯函数 在基中不能给出有意义的函数定义,这时可以把它声明成纯函数,把它的定义留给派生来做 定义纯函数: class 名{        ...构造函数不能是函数,析构函数可以是函数 1、抽象不能用于直接创建对象实例,可以声明抽象的指针和引用 2、可使用指向抽象的指针支持运行时多态性 3、派生中必须实现基中的纯函数,否则它仍将被看作一个抽象...基的析构函数为函数,所有派生的析构函数都是函数 构造函数不得是函数 如果要操作具有继承关系的的动态对象,最好使用析构函数。...    Derived d;     return 0; } // 对于一个没有任何接口的,如果想要将它定义成抽象,只能将析构函数声明为纯的 // 通常情况下在基中纯函数不需要实现 // 例外是纯析构函数要给出实现

1.3K00

【C++】多态 ⑪ ( 纯函数和抽象 | 纯函数语法 | 抽象和实现 | 代码示例 )

一、纯函数和抽象 1、纯函数 纯函数 : 在 C++ 语言中 , " 纯函数 " 是 特殊类型的 函数 , " 纯函数 " 在 父 中 声明 , 但是没有实现 ; 抽象 : " 纯函数..." 的 作用 是将 父 变为 " 抽象 " , 该类不能被实例化 , 不能创建的实例对象 ; 继承抽象必须实现纯函数 : 任何从 " 抽象 " 派生出来的 子类 都必须提供 " 纯函数...virtual void pureVirtualFunction() = 0; 3、抽象和实现 " 抽象 " 就是在中定义了一个 " 纯函数 " , " 抽象 " 至少包含一个纯函数 , 抽象...不能 创建 实例对象 , 只能作为其它的 父 ; " 纯函数 " 是一种在 父 中 声明但没有实现 的函数 , 其目的是使 父 成为抽象 ; 任何从抽象派生出来的子类都必须提供 纯函数...的实现 ; " 抽象 " 代码示例 : // 定义了纯函数的就是抽象 class AbstractClass { public: // 纯函数 virtual void

21130

JavaScript中的抽象方法

一:抽象方法 方法是成员中的概念,是只做了一个声明而未实现的方法,具有方法的就称之为抽象,这些方法在派生中才被实现。...抽象是不能实例化的,因为其中的方法并不是一个完整的函数,不能被调用。所以抽象一般只作为基被派生以后再使用。 和的继承一样,JavaScript并没有任何机制用于支持抽象。...当然,如果希望在基中添加方法的一个定义,也是可以的,只要在派生中覆盖此方法即可。...(); //调用了一个方法 }, oninit:function(){} //方法是一个空方法,由派生实现 } 实例 仍然以prototype-1.6.1为例,其中定义了一个的创建模型...它调用了一个initialize方法,从名字来看,是的构造函数。而从的角度来看,它是一个方法,是未定义的。

4.1K22

从零开始学C++之继承(三):多重继承、继承与

只能通过 sofaBed.Bed::weight_ = 10; 访问,但实际上一个sofaBed理应只有一个weight_,下面通过继承可以解决这个问题。...二、继承与 当派生从多个基派生,而这些基又从同一个基派生,则在访问此共同基中的成员时,将产生二义性,可以采用来解决。...从输出可以总结出: 1、的成员是由最远派生的构造函数通过调用的构造函数进行初始化的。...2、在整个继承结构中,直接或间接继承的所有派生,都必须在构造函数的成员初始化表中给出对的构造函数的调用。如果未列出,则表示调用该的默认构造函数。...3、在建立对象时,只有最远派生的构造函数调用的构造函数,该派生的其他基构造函数的调用被忽略。

1K00
领券