展开

关键词

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改成再看看结果。

59920

C++

---- 摘自《C++程序设计》 如果一个派生有多个直接,而这些直接又有一个共同的,则在最终的派生中会保留该间接共同数据成员的多份同名成员。 C++提供(virtual base class)的方法,使得在继承间接共同时只保留一份成员。 ---- 下面举例说明: 在如下的图中: ? 如果使用的话,Graduate将有两份age拷贝,两份gender拷贝,两份name拷贝,一个来自Student,一个来自Teacher。 所以C++中提出了的实现方式。 声明的一般形式是: class 派生名:virtual 继承方式 名称 下面是上面实例的代码: 声明person.h: #pragma once #include <string>

22810
  • 广告
    关闭

    【玩转 Cloud Studio】有奖调研征文,千元豪礼等你拿!

    想听听你玩转的独门秘籍,更有机械键盘、鹅厂公仔、CODING 定制公仔等你来拿!

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

    C++虚拟继承与

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

    29120

    c++继承 派生 函数

    参考链接: C++继承 继承    的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父中的一些东西,父也称为,子类也称为派生。派生继承了除构造函数以外的所有成员。  的布局如下:  由图可见,的布局优先级高于派生。 1.调用的构造函数 2.调用派生的构造函数 派生的析构可想而知: 1.调用派生的析构函数 2.调用的析构函数  函数  如下程序:  class Base { public:     Base 中含有函数,那么布局中存在一个函数指针,指向函数表;且其派生中与其同名同参的函数不需要加virtual也是函数。 此时和派生的布局如下:     vfptr的指针大小为4(32位机器)。因此字节数为8,派生为12。

    19520

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

    并不是“绝对的”,而是“相对的”:在它自身声明、定义的时候无需任何修饰,只是在子类继承时进行 virtual 修饰。 同时,在继承机制当中,是由最终的派生进行初始化的,本身达成了一种 “间接继承” 的关系。 也就意味着最终的派生在构造函数初始化中,要在初始化表中调用的构造函数进行初始化。 这样,就保证了不会被二次初始化。 private privat privat private private 另外,继承概念:【Example】C++ 继承 (菱形继承问题) 继承时,子类的内存结构当中不包含父。 【Example】C++ 接口(抽象)概念讲解及例子演示 【Example】C++ 继承 (菱形继承问题) 【Example】C++ Template (模板)概念讲解及编译避坑 【Example

    11130

    c++核心准则C.137: 使用避免过于一般的

    C.137: Use virtual bases to avoid overly general base classes C.137: 使用避免过于一般的‍ Reason(原因) 避免将所有的共享数据放进一个终极中。 如果很多派生之间分享特别有用的共通的"实现细节",从中分离出共通功能就是有意义的。

    20420

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

    二、继承与 当派生从多个派生,而这些又从同一个派生,则在访问此共同中的成员时,将产生二义性,可以采用来解决。 从输出可以总结出: 1、的成员是由最远派生的构造函数通过调用的构造函数进行初始化的。 2、在整个继承结构中,直接或间接继承的所有派生,都必须在构造函数的成员初始化表中给出对的构造函数的调用。如果未列出,则表示调用该的默认构造函数。 3、在建立对象时,只有最远派生的构造函数调用的构造函数,该派生的其他构造函数的调用被忽略。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

    52100

    C++编程经验(2):为析构函数的必要性

    这个要提一下,如果记不住就记住:如果不做析构函数,会有内存泄漏 解释 定义一个的指针p,在delete p时,如果的析构函数是函数,这时只会看p所赋值的对象,如果p赋值的对象是派生的对象, 就会调用派生的析构函数;如果p赋值的对象是的对象,就会调用的析构函数,这样就不会造成内存泄露。 如果的析构函数不是函数,在delete p时,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。 多少学点设计模式就清楚了。 Inherit :public Base{ //此处省去,一切从简 }; //重点看调用 int main() { Base *p = new Inherit; //这种方式的调用,这时候有没有析构就不一样了

    13810

    Golang面向对象编程之继承&【组合&接口】

    [TOC] Golang面向对象编程之继承&【组合&接口】 201808 相关说明 Golang里面没有像C++一样有继承相关的概念,但是我们却可以实现继承相关的用法,这就要用到struct、interface } 实现继承 直接上代码如下,很简单,主要就是一个struct里面包含一个匿名的struct,也就是通过匿名组合来实现 package main import ( "fmt" ) // 【 ,那么通过子类设置和获取得到的变量都是的 msgId int } func (group *GroupMsgModel) GetId() int { return group.msgId fmt.Println("group.msgType =", group.msgType, "\tgroup.MsgModel.msgType =", group.MsgModel.msgType) } 实现的用法 Golang可以interface + struct来实现的用法,必须要实现interface中定义的方法。 1,定义一个interface接口MsgModel,包含了一些方法。

    65420

    获取C++成员函数地址

    1.GCC平台 GCC平台获取C++成员函数地址可使用如下方法[1]^{[1]}: class Base{ int i; public: virtual void f1(){ 2.Visual C++平台 可以采用内联汇编的方式获取[2]^{[2]},代码如下: #define ShowFuncAddress(function) _asm{\ mov eax, function 3.通过访问函数表获取函数地址 下面的代码可以在GCC和Visual C++共同编译运行。 /********************** @className:名称 @pObj:对象地址 @index:函数表项(从0开始) **********************/ void showVtableContent f2(){ cout<<"Base's f2()"<<endl; } }; Base b; showVtableContent("Base",&b,0); //输出第一个函数

    78410

    C++获取成员函数地址

    1.GNU C++平台 GNU C++平台获取C++成员函数地址可使用如下方法[1]^{[1]}[1]: class Base { int i; public: virtual void 2.Visual C++平台 可以采用内联汇编的方式获取[2]^{[2]}[2],代码如下: #define ShowFuncAddress(function) _asm{\ mov eax, 3.通过访问函数表获取函数地址 下面的代码可以在GCC和Visual C++共同编译运行。 /********************** @className:名称 @pObj:对象地址 @index:函数表项(从0开始) **********************/ void showVtableContent Base's vtable[1]:0x00C811DB ---- 参考文献 [1]print address of virtual member function [2]C++动态联编实现原理分析

    47520

    C++核心准则C.121:如果被用来定义接口,保证它是一个纯

    绿色碧玺 C.121: If a base class is used as an interface, make it a pure abstract class C.121:如果被用来定义接口 ,保证它是一个纯‍ Reason(原因) A class is more stable (less brittle) if it does not contain data. 不包含数据的会更稳定(更少脆弱性)。接口通常应该由公开的纯函数和默认/空的纯析构函数组成。 派生通过它的Goof接口被销毁,(但是由于Goof的析构函数不是函数,导致Derived的析构函数不会被调用,译者注)因此它的string成员会发生泄露。 对于所有同时包含数据成员和并非继承自的可覆盖(非最终)函数的发出警告。

    16310

    C++函数与抽象

    的定义中,定义函数的一般形式为: virtual 函数返回值类型 函数名(形参表) { 函数体 } 为什么说函数是C++最重要的特性之一呢,因为函数承载着C++中动态联编的作用,也即多态 1.2析构函数 在的继承中,的析构函数一般都是函数。当中有函数的时候,析构函数也要定义为析构函数。 而且有时在编写的时候,发生了如下情况: (1)功能不应由去完成; (2)还没想好应该如何写的这个函数; (3)有的时候本身不应被实例化。 这时就可以用到纯函数了。 下面看一下纯函数与抽象的实例。本实验在GNU C++环境下进行。 实现了Base函数和纯函数,同时注意到,企图去实例化抽象,编译器会报错。

    84320

    c++之純函数和抽象

    在多态中,通常父函数的实现是毫无意义的,主要都是调用子类重写的内容。 因此可以将函数改为纯函数。 純函数语法:virtual 返回值类型 函数名(参数列表)=0; 当中有了純函数,这个也被称为抽象。 抽象特点: 无法实例化对象; 子类必须重写抽象中的纯函数,否则也属于抽象

    17620

    C++函数

    函数的使用方法(以下内容 摘自《C++面向对象程序》): (1)在用virtual声明成员函数为函数。     C++规定,当一个成员函数被声明为函数后,其派生中的同名函数都自动成为函数。     如果在派生中没有对函数重新定义,派生简单地继承其直接函数。 (3)定义一个指向对象的指针变量,并使它指向同一族中需要调用该函数的对象。 通过函数与指向对象的指针变量的配合使用,就能方便地调用同一的同名函数,只要先用指针指向即可。     如果指针不断地指向同一族中不同类的对象,就能不断地调用这些对象中的同名函数。 (3)应该考虑成员函数的调用是通过对象名还是通过指针或引用去访问,如果是通过指针或引用去访问,则应当什么为函数。 (4)有时在定义函数时,并不定义其函数体,即函数体是空的。

    81330

    C++中派生成员的访问形式

    C++中派生成员的访问形式主要有以下两种: 1、内部访问:由派生中新增成员对继承来的成员的访问。 2、对象访问:在派生外部,通过派生的对象对从继承来的成员的访问。 今天给大家介绍在3中继承方式下,派生成员的访问规则。 的private成员在私有派生中是不可直接访问的,所以无论是派生的成员还是通过派生的对象,都无法直接访问从继承来的private成员,但是可以通过提供的public成员函数间接访问。 的private成员在私有派生中是不可直接访问的,所以无论是派生成员还是派生的对象,都无法直接访问从继承来的private成员,但是可以通过提供的public成员函数直接访问它们。 的private成员在私有派生中是不可直接访问的,所以无论是派生成员还是通过派生的对象,都无法直接访问中的private成员。

    99370

    c++ 继承

    前提概念: 多重继承:比如a继承b,b继承c,这类关系称为多重继承 多继承:比如a继承b和c,这类关系称为多继承 典型问题: 例如: 农民和工人类继承自人类,农民工继承自农民和工人类 这种菱形的继承将为带来农民工中将有两份人类中的成员,导致数据冗余。 解决方案——继承: 关键字:virtual class people; class farmer:virtual public people; class worker:virtual public

    44470

    C++继承、函数、RTTI、友元、异常处理

    当使用protected继承时,父的所有public成员在当前子类中会变为protected。==。 函数 c++中,被定义为函数的成员,能被子类重写,函数是用virtual修饰的函数。 原理是每个有函数的对象内部维护一个的方法表成员,记录包含的方法以及对象的类型信息,函数只有在运行期(runtime)才会去动态确定使用哪个实现方法 比如: class SuperClass{ 因为引用类型是父类型,在调用普通方法时,仍是父方法,只有调用方法时,使用了真正的子类方法。而指针类型也是与引用类型类似。 析构函数与继承 c++中子类析构函数结束会自动调用父析构函数。 在c++中有对应的纯函数,具备纯函数的不能进行实例化,纯函数指将函数赋值为0的函数,如 class A{ virtual pureVirtualFunction() = 0; } 的提前声明 代码示例 try{ throw "I am string"; }catch(const char * msg){ //code } final 与java类似,c++也有final,通过在名后面或者函数后面加上

    20510

    C++私有成员会被继承吗

    1.派生间接访问私有成员 在的继承中,私有成员在派生中是“不可见“的,这种”不可见“是指在派生的成员函数中,或者通过派生的对象(指针,引用)不能直接访问它们。 在派生还是能够通过调用的共有函数的方式来间接地访问的私有成员,包括私有成员变量和私有成员函数。考察如下程序。 ()就可以简介访问A中的私有成员。 综上所述,的私有成员一定存在,也一定被继承到派生中,从大小也可以看出派生包含了的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生中访问的私有成员只能通过间接的方式进行。 ---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[8.1节]

    1.6K41

    View

    本节将分析 base.py 中最重要的的一个,它也是所有视图的 View 。 之前我们说过,尽管视图看上去的种类繁多,但每个都是各司其职的,且从的命名就可以很容易地看出这个的功能。 View Django 视图的核心就是这个,这个是所有其它视图的,它定义所有视图共有的初始化逻辑,以及一些共有的方法,以便其它视图继承。 = '0' return response HTTP 规定客户端使用该方法查询服务器所能处理的全部 HTTP 方法,对任何视图函数来说该方法的逻辑基本是不变的,所以写在了 View 中 View ),是不是和你直接在这里放一个视图函数是一样的? View 定义了所有视图的基本逻辑框架,接下来我们会继续分析一系列基于这个 View 定义的更加具体的通用视图。 如果遇到问题,请通过下面的方式寻求帮助。 在下方评论区留言。

    34950

    相关产品

    • 物联网智能视频服务(消费版)

      物联网智能视频服务(消费版)

      腾讯云物联网智能视频服务(消费版)(IoT Video(Consumer Version))为客户提供视频连接、存储和智能应用服务,安全高效。客户可简单快速地实现设备接入、宽带传输、云端存储、远程观看等一站式视频场景能力,并提供丰富的 AI 算法模型实现具体场景的智能解析及应用,实现云边协同智能应用。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券