热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高质量程序设计指南c++/c语言(34)--多重继承

多重继承的继承列表中,一个基类只能出现一次。先看一个例子:#include<iostream>usingnamespacestd;classZooAnimal{p

多重继承的继承列表中,一个基类只能出现一次。先看一个例子:

#include
using namespace std;

class ZooAnimal
{
public:
    ZooAnimal()
    {
        cout <<"ZooAnimal" << endl;
    }
    ZooAnimal(int data)
    {
        cout <<"ZooAnimal(int data)" << endl;
        d1 = data;
    }
private:
    int d1;
};

class Bear: public ZooAnimal
{
public:
    Bear()
    {
        cout <<"Bear" << endl;
    }
    Bear(int data)
    {
        cout <<"Bear(int data)" << endl;
        d2 = data;
    }
private:
    int d2;
};

class Endangered
{
public:
    Endangered()
    {
        cout <<"Endangered" << endl;
    }
    Endangered(int data)
    {
        cout <<"Endangered(int data)" << endl;
        d3 = data;
    }
private:
    int d3;
};

class Panda: public Bear, public Endangered
{
public:  
    Panda()
    {
        cout <<"Panda" << endl;
    }
    Panda(int data):Endangered(data), Bear(data)
    {
        cout <<"Panda(int data)" << endl;
        d4 = data;
    }
private:
    int d4;
};

int main(void)
{
    Panda panda(10);
    return 0;
}

1、派生类构造函数初始化所有基类

// explicitly initialize both base classes
Panda::Panda(int data):Bear(data), Endangered(data){}
// implicitly use Bear default constructor to initialize base Bear
Panda::Panda(int data):Endangered(data){}

2、构造的次序

构造函数的初始化列表只能控制用于初始化基类的值,不能控制基类的构造次序。基类的构造函数是按照基类的继承顺序被调用的

 

class Panda: public Bear, public Endangered,即对Panda而言,基类初始化的顺序:
(1)ZooAnimal
(2)Bear
(3)Endangered
(4)Panda

 

3、析构的次序

总是按照构造函数运行的逆序调用析构函数,即~Panda(),~Endangered(),~Bear(),~ZooAnimal()

4、多重继承下的类作用域

     在多重继承下,成员函数中使用的名字的查找首先在函数本身进行,如果不能在本地找到名字,就继续在成员的类中查找,然后依次查找每个基类。在多重继承下,查找同时检查所有的基类继承子树---在我们的例子中,并行查找Endangered子树和Bear/ZooAnimal子树。如果在多个子树中找到改名字,则那个名字的使用必须显示的指定使用哪个基类;否则,该名字的使用是二义性的。

     假定Bear类和Endangered类都定义了一个print函数,而Panda类没有定义该函数,则 Panda panda; panda.print();这样的语句将导致编译时错误。Panda类有两个print函数是完全合法的。派生只是导致潜在的二义性,如果没有Panda对象调用print,那就可以避免二义性。如果每个print调用明确指出想要哪个版本--Bear::print还是Endangered::print,也可以避免错误。只有在存在使用该成员的二义性尝试的时候,才会出错。

     函数调用时首先发生名字查找。虽然两个继承的print成员的二义性相当明显,但是也许更令人惊讶的是,即使两个继承的函数有不同的形参表,也会产生错误。类似的,即使函数在一个类中是私有的而在另一个类中是公用的或受保护的,也是错误的。最后,如果在ZooAnimal类中定义了print而在Bear类中没有定义,调用仍是错误的。


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • C++ OpenCV实战之标记点检测的实现
    C++ OpenCV实战之标记点检测的实现-在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。大致思路如下,首先先选择要处理的 ... [详细]
  • YoucanSolveaGeometryProblemtooProblemDescriptionManygeometry(几何)problemsweredesignedinth ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • Igotthiscode(IknowitsinSpanishIcantranslateifneeded)wheretheygivemethefunctionS ... [详细]
  • 数据结构-图详解(图基本概念、图的存储结构及C++实现)
    本文主要介绍关于数据结构,c++,图论的知识点,对【数据结构-图详解(图基本概念、图的存储结构及C++实现)】和【数据结构图的存储结构代码】有兴趣的朋友可以看下由【NUC_Dodamce】投稿的技术文 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
author-avatar
阿莱沃_132
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有