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日

相关文章

  • VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法

    首先,需要明确一点,禁用文本框右键菜单的复制、粘贴等功能,其实也就是禁用系统默认的快捷键,因此我们需要通过VB代码来修改系统默认快捷键,具体步骤如下: 步骤一:新建窗体并设置属性 首先,需要新建一个窗体,并在窗体中添加一个文本框控件,随后需要设置文本框控件的以下属性: Name:txtInput MultiLine:True EnableContextMen…

    other 2023年6月27日
    00
  • epool介绍

    epoll介绍 epoll是Linux内核提供的一种高效的I/O多路复用机制,用于处理大量的并发连接。它可以监视多个文件描述符,当其中任何一个文件描述符就绪时,就通知应用程序进行处理。ep是Linux内核2.6版本引入的,相比于select和poll,它具有更好的性能和可伸缩性。 epoll的优点 支持较大的并发连接数,可以处理数百万个连接。 监视的文件描述…

    other 2023年5月8日
    00
  • js的基本数据类型与引用数据类型

    JavaScript的基本数据类型与引用数据类型 在JavaScript中,数据类型可以分为基本数据类型和引用数据类型。这两种类型在JavaScript中有如下区别。 基本数据类型 JavaScript的基本数据类型有:字符串(String)、数字(Number)、布尔(Boolean)、null,undefined,以及Symbol(ES6新增)。这些数据…

    其他 2023年3月28日
    00
  • springBoot+dubbo+zookeeper实现分布式开发应用的项目实践

    以下是”Spring Boot + Dubbo + ZooKeeper 实现分布式开发应用的项目实践”的攻略: 基础知识 在实现分布式开发应用之前,需要先学习一些基础知识。这些知识包括: Spring Boot:一个开源的、快速开发的Java Web框架。 Dubbo:一个高性能的Java RPC框架。 ZooKeeper:一个开源的分布式应用程序协调服务。…

    other 2023年6月27日
    00
  • Android 获取IP地址的实现方法

    Android 获取IP地址的实现方法 在Android应用程序中,可以使用以下方法获取设备的IP地址。 方法一:使用WifiManager // 在Activity或Fragment中获取WifiManager实例 WifiManager wifiManager = (WifiManager) getApplicationContext().getSyst…

    other 2023年7月31日
    00
  • Win10下ftp搭建配置图文教程(测试成功)

    Win10下ftp搭建配置图文教程 FTP(File Transfer Protocol,文件传输协议)是一个在计算机之间进行文件传输的标准协议。在Win10中,我们可以搭建自己的FTP服务器来传输文件。本文将为大家详细介绍Win10下ftp搭建配置的过程。 1. 安装IIS 首先,我们需要安装IIS(Internet Information Service…

    other 2023年6月27日
    00
  • javascript基础进阶_深入剖析执行环境及作用域链

    JavaScript基础进阶: 深入剖析执行环境及作用域链攻略 1. 执行环境(Execution Context) 执行环境是JavaScript中代码执行的环境,它包含了变量、函数和对象等。在执行JavaScript代码时,会创建一个全局执行环境,并且每当函数被调用时,都会创建一个新的执行环境。 执行环境的创建过程包括以下几个步骤:- 创建变量对象(Va…

    other 2023年8月19日
    00
  • Android实现双层ViewPager嵌套

    Android实现双层ViewPager嵌套攻略 在Android开发中,有时候我们需要实现双层ViewPager嵌套的效果,即一个ViewPager中包含多个子ViewPager。下面是一个详细的攻略,帮助你实现这个功能。 步骤一:添加依赖 首先,在你的项目中添加以下依赖: implementation ‘androidx.viewpager2:viewp…

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