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

正确设置基类和派生类之间的函数返回

在面向对象编程中,基类和派生类之间的函数返回是一个重要的概念。正确设置基类和派生类之间的函数返回可以确保代码的可维护性和扩展性。

基类是指在继承关系中位于上层的类,派生类是指从基类继承而来的类。在基类中定义的函数可以被派生类继承和重写。

为了正确设置基类和派生类之间的函数返回,需要遵循以下几个原则:

  1. 函数返回类型的一致性:基类和派生类中的函数返回类型应保持一致,即相同的返回类型或者返回类型之间存在继承关系。这样可以确保派生类的函数可以替代基类的函数,实现多态性。
  2. 函数重写:派生类可以重写基类中的函数,即在派生类中重新定义和实现基类中已有的函数。重写函数时,返回类型应与基类中的函数返回类型保持一致或者是其子类型。
  3. 虚函数和纯虚函数:基类中可以将函数声明为虚函数或纯虚函数。虚函数可以在派生类中被重写,而纯虚函数必须在派生类中被实现。虚函数和纯虚函数的使用可以实现运行时的多态性。
  4. 返回类型协变:C++中支持返回类型协变,即派生类中的重写函数可以返回基类函数返回类型的子类型。这样可以更灵活地处理函数返回类型的继承关系。

正确设置基类和派生类之间的函数返回可以提高代码的可读性和可维护性。通过合理的继承和重写关系,可以实现代码的复用和扩展。在实际应用中,可以根据具体的业务需求和设计原则来确定基类和派生类之间的函数返回关系。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析):https://cloud.tencent.com/product/mpns
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生类中虚函数非虚函数继承效果

,在编译阶段就确定好是被谁调用,所以他只认哪个指针指向自己,这里是Animal指针指向,所以他就调用Animal里面的,普通函数是父为子类提供“强制实现”,也就是只要是父指针调用普通函数,那就是父普通函数...而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

7910

C# 继承 派生类初始化C# 多重继承

当创建一个时,程序员不需要完全重新编写新数据成员成员函数,只需要设计一个新,继承了已有的成员即可。这个已有的被称为,这个新被称为派生类。...派生类 一个可以派生自多个或接口,这意味着它可以从多个或接口继承数据函数。...C# 中创建派生类语法如下: class { ... } class : { ... } 假如一个是Shape,一个派生类是Rectangle...派生类继承了成员变量成员方法。...: 1、继承语法:class 子类名 : class 父名{ //子类体 } 2、继承特点:子类拥有所有父中所有的字段、属性方法 3、一个可以有多个子类,但是父只能有一个 4

4.5K20
  • 从零开始学C++之继承(二):继承与构造函数派生类转换

    一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类构造函数需要给构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...四、派生类转换 当派生类以public方式继承时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用

    1.5K00

    c++学习笔记4,调用派生类顺序构造析构函数(一个)

    大家好,又见面了,我是全栈君 测试源代码: //測试派生类构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...endl; } }; 測试代码: int main() { A a; A *a1; cout<<"能够看到a1并没有调用构造函数..."<<endl; A *a2=new A; //仅仅有在new 一个对象时候才会调用构造函数 cout<<"能够看到...a3也并没有调用构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类对象时候,首先调用构造函数,然后才是调用派生类自己构造函数...而在析构时候,顺序则刚好相反,先调用派生类析构函数,然后才是调用构造函数。这是由于对象创建时候对象存放在堆栈中原因。(new 对象尽管是存在堆中,可是在堆栈中依旧存放其堆中地址,因此。

    70010

    【C++进阶】多态理解

    例外:              a.派生类可以不加 virtual  ,因为派生类已经继承了 virtual;              b.协变(函数返回对象指针或者引用,派生类函数返回派生类对象...重写析构函数 其实编译后析构函数名称统一处理成destructor,此时析构函数函数名相同,参数列表也相同,再加上 virtual  修饰,此时就重写了派生类析构函数,即构成了多态。...结论 析构函数建议设置成虚函数,因为有时可能利用多态方式通过指针调用子类析构函        数,尤其是父析构函数强力建议设置为虚函数,这样动态释放父指针所指子类      对象时,能够达到析构多态...,一个在,一个在派生类;            2.都必须是虚函数;            3.满足三同(函数名,返回值,参数列表相同(协变除外)); 总结 1.重写比重定义条件更加严苛; 2.两个派生类同名函数...}; 四.多态原理 虚函数表 其实派生类函数都会被放进虚函数表(简称虚表)里,实例化出对象后会生成一个指针(_vfptr),指向虚函数表,其实虚函数表就是一个函数指针数组,里面存着虚函数地址

    11610

    《C++Primer》第十五章 面向对象程序设计

    这些包含两个成员函数: isbn():返回书籍ISBN编号,不涉及派生类特殊性 net_price(size_t):返回书籍实际价格,是类型相关希望每个派生类各自定义适合自身版本,...3.3 在对象之间不存在类型转换 派生类自动类型转换只对指针或者引用类型有效,在派生类类型类型之间不存在这样转换。...3.4 存在继承关系类型之间转换规则 要想理解在具有继承关系之间发生类型转换,有三点特别重要: 从派生类类型转换只对指针或者引用类型有效 派生类不存在隐式类型转换 任何其他成员一样...一般情况下派生类中虚函数返回类型是本身指针或引用时,上述规则无效。比如D由B派生而来,则函数可以返回B*而派生类对应函数可以返回D*。...只要析构函数是虚函数,就能确保当我们delete指针时将运行正确析构函数版本。 我们之前介绍过一条经验准则:如果一个需要析构函数,那么它同样也需要拷贝赋值操作。

    1.2K20

    封装、继承、多态、重载:C++中强大特性与代码设计

    封装提供了与外部世界之间接口,隐藏了内部实现细节,提高了代码可维护性安全性。...继承可以通过创建一个新并从派生来实现,新将自动获得成员变量成员函数,同时可以添加新成员或重写成员函数。 继承主要目的是实现代码重用构建之间层次关系。...成员声明列表中包含成员变量以及成员函数,是派生类新增成员。 “:”是一个运算符,表示派生类之间继承关系。...dynamic_cast用于将指针或引用转换为派生类指针或引用,如果转换成功,返回指向派生类指针或引用;如果转换失败,则返回空指针或抛出bad_cast异常。...函数名字相同 参数相同 函数必须有virtual关键字 override 重定义(派生类) 不同范围(分贝位于派生类函数名与参数都相同,无virtual关键字 函数名相同

    32710

    继承

    派生类之间关系: 派生类对象可以使用(公有的)方法。 指针可以在不进行显示类型转换情况下指向派生类对象,但只能调用方法。...实现多态公有继承方法: 在派生类中重新定义方法。 使用虚方法(虚函数)。 3. 静态联编动态联编 函数名联编:编译器将源代码中函数调用解释为执行特定函数代码称为函数名联编。...但对于虚函数这种情况,编译器在编译时候并不一定知道用户将会选择哪种类型对象,因此,编译器必须生成能够在程序运行时根据用户选择正确函数代码。...且该转换是可以传递,例如A,其派生类AP,AP派生类APP,则A指针或引用可以指向或引用AP对象APP对象。 相反,我们将指针或引用转换为派生类指针或引用称为向下强制转换。...因此,如果要重新定义继承方法,则应确保与原来原型完全相同,但是如果返回类型是引用或指针,则可以修改为指向派生类引用或指针,即允许返回类型随类型变化而变化,这种特性被称为返回类型协变。

    69720

    TypeScript 官方手册翻译计划【十二】:

    — 它返回类型始终是实例类型 super 调用 JavaScript 一样,如果你有一个一个派生类,那么在派生类中使用 this....extends 子句 可以继承自某个派生类拥有所有属性方法,同时也可以定义额外成员。...,派生类会遵循约束。...根据 JavaScript 定义,初始化顺序是: 初始化字段 执行构造器 初始化派生类字段 执行派生类构造器 这意味着,因为构造器执行时候派生类字段尚未进行初始化,所以构造器只能看到自己...子类实例子类之间 instanceof 可能被破坏,所以 (new MsgError()) instanceof MsgError 将会返回 false。

    2.6K10

    第 15 章 面向对象程序设计

    而对于派生类中覆盖函数,其形参必须相同,返回类型也要与匹配。而当虚函数返回类型是本身指针或引用且可进行类型转换时,也是允许。 ?...不论 D以什么方式继承 B,D成员函数友元都能使用派生类类型转换;派生类向其直接类型转换对于派生类成员友元来说永远是可访问。...析构函数虚属性会被继承,无论派生类中使用合成析构函数还是自定义析构函数,都将是虚函数。这样,就能保证 delete指针时总能运行正确析构函数版本。...如果在中有一个不可访问删除掉析构函数,则派生类中合成默认拷贝构造函数将是删除,因为编译器无法销毁派生类对象部分。 过去一样,编译器将不会隐式合成一个删除掉移动操作。...相当于在用户核心之间又多了一个缓冲区域,对于用户而言,只需要使用接口就可以了,而不用关系核心如何实现。这样,在进行核心功能更改时,过去使用用户代码仍然可以正常运行。

    1K30

    【C++】模板继承多态

    ,让派生类重写虚函数,然后就可以使用多态 之间关系:组合and继承 组合:a part of …一部分关系 继承:a kind of… 一种·关系 总结: 外部只能访问对象public...通过调用·相应构造函数来初始化 派生类构造函数析构函数,负责初始化清理派生类部分 派生类继承来成员初始化清理谁来负责?...是由构造析构来负责 派生类对象构造析构过程是: 派生类调用构造函数,初始化从继承来成员。 调用派生类自己构造函数。...覆盖:派生类方法,返回值,函数名以及参数列表都相同,而且方法是虚函数,那么派生类方法就自动处理成虚函数,他们之间成为覆盖关系。...四: 如果派生类方法继承来某个方法,返回值,函数名,参数列表都相同,而且方法是virtual虚函数,那么派生类这个方法,自动处理成虚函数

    9510

    C++:44---关键字virtual、override、final

    ,其解析过程发生在编译时而非运行时 派生类可以不覆盖(重写)它继承函数 重写(覆盖)概念与规则 派生类重写(覆盖)函数,其中函数名,参数列表,返回值类型都必须一致,并且重写(覆盖)函数是...virtual函数函数在子类访问权限可以不同 相关规则: ①如果虚函数返回值类型是基本数据类型:返回值类型必须相同 ②如果虚函数返回值类型是本身指针或引用:返回值类型可以不同,但派生类返回值类型小于返回值类型...,于是就将此函数定义为虚函数,让派生类各自实现自己功能版本函数(但是也可以不实现) 我们通常在中将这两种成员函数分开来: 一种是希望派生类进行覆盖函数 一种是希望派生类直接继承而不要改变函数...三、覆盖(重写) 概念:函数,如果派生类有相同函数,则子类方法覆盖了父方法 覆盖(重写)与隐藏关系: 覆盖与隐藏都是子类出现与父相同函数名,但是有很多不同 隐藏可以适用于成员变量函数...,但是不建议,因为这样就违反了默认实参最初目的 建议:如果虚函数使用了默认实参,那么派生类中定义默认实参最好一致 class A { virtual void func1(int a, int

    4K31

    【C++深度探索】全面解析多态性机制(一)

    ,隐藏是只要在派生类中有与函数名相同函数就构成,而重写则需要返回值、函数参数列表完全相同才构成 3.多态实现 多态是在不同继承关系对象,去调用同一函数,产生了不同行为。...4.虚函数重写两个例外 协变(派生类函数返回值类型不同) 即函数返回对象指针或者引用,派生类函数返回派生类对象指针或者引用时,称为协变。...前面我们学习过虚函数重写必须要求派生类除了函数体以外其它完全相同,但是对于协变,派生类返回值类型可以不同,但派生类函数返回类型必须是继承关系 //协变 class A {};...p2指向对象正确调用析构函数。...因此,可以重写(覆盖)析构函数,以处理派生类特有的资源清理需求。 尤其是父析构函数强力建议设置为虚函数,这样动态释放父指针所指子类对象时,能够达到析构多态。

    11310

    C++进阶:详解多态(多态、虚函数、抽象以及虚函数原理详解)

    运行时多态允许通过指针或引用来调用派生类函数,实现了动态绑定。 2.多态定义实现 2.1多态构成条件 多态实现通常依赖于虚函数。在中声明虚函数,然后在派生类中进行重写(覆盖)。...在进行函数重写时,子类中函数返回值类型、函数名、参数列表必须与函数完全相同 注意:在重写函数时,派生类函数在不加virtual关键字时,虽然也可以构成重写(因为继承后函数被继承后在派生类依旧保持虚函数属性...2.2.3虚函数重写两个例外 协变(派生类函数返回值类型不同) 派生类重写函数时,与函数返回值类型不同。...即函数返回对象指针或者引用,派生类函数返回派生类对象指针或者引用时,称为协变 class A { public: virtual A* f() { return new...多态必须使用指针/引用来调用虚函数原因主要是因为指针/引用可以在运行时指向派生类对象,而且能正确地调用派生类函数

    54310

    【C++】C++ this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加参数是 对象本身指针 ; 在 Student 中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身成员 ; 在全局函数中 , 实现两个 Student 相加 , 接收两个 Student 引用类型参数 , 引用相当于一级指针...return s; } 详细代码 , 参考最后完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 定义了有参构造函数 , 则其默认无参构造函数 , 就不会生成...Student 对象 , 就会报错 ; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 名 对象名 方式定义对象变量 ; class Student

    20520

    轻松搞定面试中“虚”

    函数作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数,达到多态目的。 2.什么是纯虚函数,什么是纯虚,有什么作用?...是否每个析构函数都要设置成virtual?是否可以将析构函数设置成内联函数。 这样做是为了当用一个指针删除一个派生类对象时,派生类析构函数会被调用。...在构造时候,虚函数是非虚,不会走到派生类中,既是采用静态绑定。...vtable,通过指针做虚函数调用时,也就是多态调用时,编译器静态地插入取得这个vptr,并在vtable表种查找函数地址代码,这样就能调用正确函数。...c++通过下面两个操作符提供RTTI: (1)typeid:返回指针或引用所指对象实际类型。 (2)dynamic_cast:将类型指针或引用安全转换为派生类指针或引用。

    66720

    C++ 一篇搞懂继承常见特性

    派生类派生类是通过对进行修改扩充得到,在派生类中,可以扩充新成员变量成员函数派生类拥有全部成员函数成员变量,不论是private、protected、public。...需要注意是:在派生类各个成员函数中,不能访问 private 成员。...---- — 2 — 继承关系复合关系 || 01 之间两种关系 继承关系是「是」关系: A,B 「是」 A 派生类。 逻辑上要求:一个 B 对象也「是」一个 A 对象。...---- — 5 — 派生类构造函数 通常在初始化派生类构造函数时,派生类构造函数是要实现初始化构造函数。...第33-36行代码是正确派生类构造函数初始化构造函数方式,通过调用构造函数来初始化,在执行一个派生类构造函数 之前,总是先执行构造函数

    59130

    【C++】———— 继承

    二、派生类赋值转换: 我们在前面的学习知道相近类型之间是能够赋值,因为他们之间会发生隐式类型转换。...所以就会报错 2.2派生类对象引用赋值给对象 派生类对象引用赋值能够给对象,其中引用不许需要const,证明其赋值之间并没有发生隐式类型转换,产生临时对象。...调用析构函数时会先调用派生类析构函数,再调用析构函数。 4.2:派生类构造函数必须调用构造函数初始化那一部分成员。...因为编译器为了保证析构最后调用,所以在调用派生类析构函数之后会自动调用构造函数。所以为了保证调用正确顺序,派生类析构函数我们不需要显示定义。...继承一定程度破坏了封装,改变,对派生类有很大影响。派生类依赖关系很强,耦合度高。 8.2. has-a关系 组合是一种has - a关系。

    7410
    领券