详解C++编程中多级派生时的构造函数和访问属性

  1. 多级派生的构造函数

C++中多级继承的构造函数可以使用初始化列表来构造。子类的构造函数可以通过在初始化列表中调用父类的构造函数来完成基类的初始化工作,同时也可以在子类的初始化列表中为子类自身的成员变量赋初值。

例如下面的代码:

class Grandparent {
public:
    int a;
    Grandparent(int _a) : a(_a) {}
};

class Parent : public Grandparent {
public:
    int b;
    Parent(int _a, int _b) : Grandparent(_a), b(_b) {}
};

class Child : public Parent {
public:
    int c;
    Child(int _a, int _b, int _c) : Parent(_a, _b), c(_c) {}
};

int main() {
    Child child(1, 2, 3);
    cout << child.a << " " << child.b << " " << child.c << endl;
    return 0;
}

这里我们定义了三个类Grandparent、Parent和Child,Child是多重继承自Parent和Grandparent。我们定义了一个带有三个参数的Child的构造函数,在初始化列表中调用了Parent的构造函数和Grandparent的构造函数,并对自己的成员c赋初值。在main函数中我们创建了一个Child类型的对象child,并输出了它的三个成员变量的值。

输出结果为:

1 2 3
  1. 多级派生的访问属性

多级派生中的访问属性遵循C++的继承规则。子类可以访问父类的公有成员,但不能访问父类的私有成员。如果父类的成员是保护的,子类可以访问,但子类的子类不能访问。

我们可以通过下面的代码来说明这个规则:

class Grandparent {
public:
    int a;
protected:
    int b;
private:
    int c;
};

class Parent : public Grandparent {
public:
    void foo() {
        cout << a << endl;  // 可以访问Grandparent的公有成员
        cout << b << endl;  // 可以访问Grandparent的保护成员
        // cout << c << endl;  // 错误:不能访问Grandparent的私有成员
    }
};

class Child : public Parent {
public:
    void bar() {
        cout << a << endl;  // 可以访问Grandparent的公有成员
        cout << b << endl;  // 可以访问Grandparent的保护成员
        // cout << c << endl;  // 错误:不能访问Grandparent的私有成员
    }
};

int main() {
    Child child;
    child.foo();  // 可以访问
    child.bar();  // 可以访问
    // cout << child.a << endl;  // 错误:不能直接访问Grandparent的成员
    // cout << child.b << endl;  // 错误:不能直接访问Grandparent的成员
    // cout << child.c << endl;  // 错误:不能直接访问Grandparent的成员
    return 0;
}

这里我们定义了三个类Grandparent、Parent和Child,Child是多重继承自Parent和Grandparent。Grandparent有一个公有成员a、一个保护成员b和一个私有成员c。Parent和Child都有一个成员函数foo()和bar(),分别用来测试访问Grandparent的成员。在main函数中创建一个Child类型的对象child,并调用它的foo()和bar()函数来测试。

输出结果为:

0
0

这里我们发现,Child对象的a和b成员可以正常访问,但不能直接访问Grandparent的成员。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++编程中多级派生时的构造函数和访问属性 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • esri和arcgis

    Esri和ArcGIS Esri是一家致力于地理信息系统(GIS)技术和数据的研发、生产和销售的公司,而ArcGIS则是他们所生产的GIS软件平台。本文将对Esri和ArcGIS进行简单的介绍和评价。 Esri概述 Esri成立于1969年,总部位于美国加州的雷迪兰兹,是全球GIS技术领域的领导厂商之一,为全球超过350,000个组织和机构提供各种GIS软件…

    其他 2023年3月29日
    00
  • Android SDK三种更新失败及其解决方法

    Android SDK三种更新失败及其解决方法 1. 无法连接到服务器 如果你在更新Android SDK时收到“无法连接到服务器”的错误消息,这可能是由于网络问题造成的。以下是解决此问题的步骤: 检查你的网络连接是否正常,确保网络连接可用并且打开了代理。 重新启动Android SDK。点击Android SDK Manager窗口右上角的“关闭”按钮,然…

    other 2023年6月27日
    00
  • Spring Cloud之配置中心的搭建

    下面详细讲解一下“Spring Cloud之配置中心的搭建”的完整攻略。 一、前置条件 在开始之前,需要先安装以下软件: Java JDK和JRE:安装Java JDK和JRE(Java Runtime Environment)并配置环境变量。可以在Oracle官网下载Java安装包。 Maven:在官网下载Maven压缩包并解压,然后在环境变量中设置MAV…

    other 2023年6月25日
    00
  • MFC日期显示

    以下是详细的MFC日期显示攻略,包括两个示例说明: 描述 MFC是Microsoft Foundation Classes的缩写,是一组C++类库用于开发Windows应用程序。在MFC应用程序中,我们经常需要显示日期和时间。本文将介绍如何在MFC应用程序中显示日期,包括两个示例说明。 解决方法 以下是在MFC应用程序中显示日期的详细步骤: 创建控件 首先,…

    other 2023年5月7日
    00
  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    低门槛开发iOS、Android、小程序应用的前端框架详解 开发移动应用是当代互联网技术的重要组成部分,但对于前端开发者来说,开发iOS、Android、小程序等移动应用可能需要掌握不同的语言和框架。为了降低移动应用开发的门槛,现在有很多前端框架可以帮助我们进行相关开发工作。下文将详细介绍两种低门槛开发移动应用的前端框架和相应操作步骤。 1. uni-app…

    other 2023年6月27日
    00
  • DOS命令行下使用HaoZip进行文件压缩的方法

    以下是在DOS命令行下使用HaoZip进行文件压缩的步骤: 1. 下载和安装HaoZip 首先需要下载并安装HaoZip压缩软件,并将其添加到系统环境变量中,以便在命令行中使用。安装过程中选中“将HaoZip添加到系统环境变量中”选项即可。 2. 使用HaoZip压缩文件 在DOS命令行下,使用hz.exe命令来执行HaoZip。以下是两个基本示例: 压缩某…

    other 2023年6月26日
    00
  • 详解C语言的exp()函数和ldexp()函数以及frexp()函数

    详解C语言的exp()函数和ldexp()函数以及frexp()函数 1. exp()函数 1.1 函数简介 exp()函数是C语言中一个计算指数函数的函数,可以计算以自然对数为底的指数函数。 1.2 函数原型 double exp(double x); 1.3 函数参数 exp()函数的参数x为一个double类型的数值,表示指数。 1.4 函数返回值 e…

    other 2023年6月26日
    00
  • 魔兽世界7.3.5冰DK怎样输出 冰DK团本大秘境输出手法及技能循环

    魔兽世界7.3.5冰DK输出攻略 前言 冰死亡骑士(Frost Death Knight,简称冰DK)是一种高输出、高生命力的职业,非常适合在团本和大秘境中发挥作用。本文将为大家详细介绍冰DK的输出手法及技能循环。 基础属性和天赋选择 冰DK的主要属性为力量(Strength)、暴击(Critical Strike)、急速(Haste)和全能(Versati…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部