C++ 的三种访问权限与三种继承方式

C++中的三种访问权限为:public(公有)、private(私有)和protected(保护)。而C++中的三种继承方式为:public继承、private继承和protected继承。下面就为大家详细讲解一下这些内容。

三种访问权限

1. public

public是一个允许最广泛的访问控制级别。在public访问级别下,外部用户可以通过对象(或指向对象的指针)来访问类的所有成员,包括公共数据成员、成员函数和继承来的公有成员。

示例代码:

class Animal {
public:
    string name;
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : public Animal {
public:
    void bark() { 
        cout << "Dog is barking..." << endl; 
    }
};

int main() {
    Dog dog;
    dog.name = "Tom";
    dog.eat();
    dog.bark();
    return 0;
}

在上述示例中,Animal类中有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,通过对象dog的访问权限,外部用户可以访问到Animal类和Dog类中的所有公有成员。

2. private

private访问权限针对类的成员的最严格的访问权限。在private访问级别下,只有类的成员函数和其友元函数才能访问类的私有数据成员和成员函数。外部用户在访问类的私有成员时,会发生编译错误。

示例代码:

class Animal {
private:
    int age;
public:
    string name;
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : public Animal {
public:
    void bark() {
        cout << "Dog is barking..." << endl;
    }
};

int main() {
    Dog dog;
    dog.name = "Tom";
    dog.age = 4;   // 编译错误
    return 0;
}

在上述示例中,Animal类中有一个私有数据成员age,也有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,但试图访问Animal类中的私有数据成员age时会发生编译错误,因为访问权限受限。

3. protected

protected访问权限的约束位于public和private之间。在protected访问级别下,类的成员函数、类的成员函数所定义的类及其子类才能访问类的保护成员和保护成员函数,外部用户无法直接访问。

示例代码:

class Animal {
protected:
    int age;
public:
    string name;
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : public Animal {
public:
    void bark() {
        cout << "Dog is barking..." << endl;
        cout << "age=" << age << endl;   // 可访问age
    }
};

int main() {
    Dog dog;
    dog.name = "Tom";
    dog.age = 4;   // 编译错误
    return 0;
}

在上述示例中,Animal类中有一个保护数据成员age,也有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark,在其中访问了父类Animal的保护数据成员age。全局main函数中定义了Dog类的一个对象,但试图访问Animal类中的保护数据成员age时会发生编译错误,因为访问权限受限。

三种继承方式

1. public继承

public继承是C++中最常用的继承方式。它表示基类定义的所有公有成员都可以被派生类访问,基类定义的私有成员不能被派生类直接访问,基类定义的保护成员可以被派生类通过继承关系或友元关系访问。

示例代码:

class Animal {
public:
    string name;
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : public Animal {
public:
    void bark() {
        cout << "Dog is barking..." << endl;
    }
};

int main() {
    Dog dog;
    dog.name = "Tom";
    dog.eat();
    dog.bark();
    return 0;
}

在上述示例中,Animal类中有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,通过对象dog的访问权限,外部用户可以访问到Animal类和Dog类中的所有公有成员,包括从基类Animal继承过来的成员。

2. private继承

private继承表示基类定义的所有公有成员、保护成员和私有成员都被派生类继承过来,但都变成了派生类的私有成员,外部用户无法访问这些成员。派生类可以通过成员函数访问这些私有成员。

示例代码:

class Animal {
public:
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : private Animal {
public:
    void bark() {
        cout << "Dog is barking..." << endl;
        eat();   // 可以访问父类的公有成员函数
    }
};

int main() {
    Dog dog;
    dog.eat();   // 编译错误,不能访问父类的公有成员函数
    return 0;
}

在上述示例中,Animal类中有一个公共成员函数eat。在Dog类中,使用private继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,试图在main函数中访问Dog类继承过来的公有成员函数eat时,会发生编译错误,因为eat函数在Dog类中变成了私有成员。

3. protected继承

protected继承表示基类定义的所有公有成员和保护成员都被派生类继承过来,但都成了派生类的保护成员,外部用户无法访问这些成员。派生类可以通过成员函数或者友元函数访问这些成员。

示例代码:

class Animal {
public:
    void eat() {
        cout << "Animal is eating..." << endl;
    }
};

// 派生类Dog
class Dog : protected Animal {
public:
    void bark() {
        cout << "Dog is barking..." << endl;
        eat();   // 可以访问父类的公有成员函数
    }
};

int main() {
    Dog dog;
    dog.eat();   // 编译错误,不能访问父类的公有成员函数
    return 0;
}

在上述示例中,Animal类中有一个公共成员函数eat。在Dog类中,使用protected继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,试图在main函数中访问Dog类继承过来的公有成员函数eat时,会发生编译错误,因为eat函数在Dog类中变成了保护成员。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 的三种访问权限与三种继承方式 - Python技术站

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

相关文章

  • Java实现批量修改文件名和重命名的方法

    下面是详细讲解“Java实现批量修改文件名和重命名的方法”的完整攻略,包含两条示例说明。 1. 引言 在我们日常的开发工作中,有时候需要对文件进行批量修改文件名或重命名,手动修改文件名是一项较为耗时、繁琐的工作,因此,使用Java程序来实现批量修改文件名和重命名是一项非常实用的技能。 2. 实现方法 Java中实现批量修改文件名和重命名的主要步骤包括:获取指…

    other 2023年6月26日
    00
  • 网络中常见的IP地址疑难问题解答

    网络中常见的IP地址疑难问题解答攻略 1. IP地址的分类 在网络中,IP地址是用于标识设备的唯一地址。IP地址分为IPv4和IPv6两种类型。 IPv4地址 IPv4地址由32位二进制数组成,通常以点分十进制表示。例如,192.168.0.1是一个IPv4地址。 IPv6地址 IPv6地址由128位二进制数组成,通常以冒号分隔的十六进制表示。例如,2001…

    other 2023年7月29日
    00
  • base64怎样转pdf前端

    下面我将为你详细讲解 base64 怎样转 PDF 前端的完整攻略。 准备工作 首先,要将 base64 编码的字符串转为 Blob 对象,然后使用 URL.createObjectURL 方法将 Blob 对象转换为 URL。接下来,只需要创建一个隐藏的 iframe 标签,并将 URL 赋值给 iframe 的 src 属性即可。 步骤 将 base64…

    其他 2023年4月16日
    00
  • vue3中echarts的tooltip组件不显示问题及解决

    下面就是关于“vue3中echarts的tooltip组件不显示问题及解决”的详细攻略。 问题描述 在Vue3项目中,使用ECharts作为图表库进行数据可视化时,有时候会出现Tooltip组件无法显示的问题。 解决步骤 步骤一:检查ECharts版本 首先,我们要检查一下当前项目中使用的ECharts版本是否支持Vue3。如果版本过低或过高,会导致组件无法…

    other 2023年6月27日
    00
  • 如何快速合并多个txt文本内容

    如何快速合并多个txt文本内容 在日常生活和工作中,我们常常需要将多个txt文本内容进行合并。如果手工逐一复制粘贴是非常耗时和低效的,而且容易出错。那么如何才能快速合并多个txt文本内容呢?本文将介绍三种方法。 方法1:使用CMD命令 打开CMD命令提示符; 进入需要合并的txt文本所在的文件夹; 输入如下指令: cmdcopy *.txt newfile.…

    其他 2023年3月28日
    00
  • js控制台不同的打印方式

    JavaScript控制台不同的打印方式 在JavaScript开发中,控制台是一个非常有用的工具,可以用来调试代码和输出信息。控制台提供了多种印方式,本文将介绍控制台的不同打印方式,包括console.log()、console.warn()、console.error()和console.table()。在介绍每种方式时,将提供至少两个示例说明。 con…

    other 2023年5月9日
    00
  • 如何将Android Studio卸载干净

    以下是如何将Android Studio卸载干净的完整攻略,包含两条示例说明。 1. 下载Android Studio卸载工具 在正式卸载Android Studio之前,我们需要先下载官方提供的卸载工具来清理软件残留。具体步骤如下: 打开Android官方网站(https://developer.android.com/)。 在页面右上角选择“Downlo…

    other 2023年6月27日
    00
  • C# WPF开源UI控件库MaterialDesign介绍

    C# WPF开源UI控件库MaterialDesign介绍 MaterialDesign是一个基于Google Material Design风格的开源UI控件库,支持C#和WPF框架。它提供了一系列高质量的UI控件和组件,能够帮助快速搭建出美观且具有交互性的应用程序界面。 MaterialDesign的介绍 MaterialDesign是一个免费的开源项目…

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