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日

相关文章

  • php adodb连接带密码access数据库实例,测试成功

    PHP ADODB连接带密码Access数据库实例,测试成功攻略 首先,确保您已经安装了ADODB扩展,并在PHP配置文件中启用了该扩展。 在PHP代码中引入ADODB库,并创建一个ADODB连接对象。 “`php “` 示例说明1:将C:/path/to/your/database.mdb替换为您实际的Access数据库文件路径,将your_passw…

    other 2023年10月18日
    00
  • 聊聊Python代码中if __name__ == ‘__main__‘的作用是什么

    聊聊Python代码中if name == ‘main’的作用是什么 在Python中,if __name__ == ‘__main__’ 是一个常见的代码块,它在一个模块被直接执行时会被执行,而在该模块被导入时不会被执行。这个代码块的作用是为了区分模块是被直接执行还是被导入执行。 作用 当一个Python脚本被执行时,Python解释器会将该脚本作为主程序…

    other 2023年8月5日
    00
  • iDempiere 使用指南 绿色版一键启动测试环境

    iDempiere 使用指南 绿色版一键启动测试环境 开发测试环境的设置是 iDempiere 实现数字化转型必不可少的一步。在使用 iDempiere 时,搭建一个安全可靠的测试环境是非常重要的。为了帮助 iDempiere 用户更加方便地搭建测试环境,我们发布了 iDempiere 使用指南 绿色版一键启动测试环境。 iDempiere 简介 iDemp…

    其他 2023年3月28日
    00
  • xwpfdocument创建和读取officeword文档基础篇

    以下是关于使用Apache POI的XWPFDocument创建和读取Office Word文档的完整攻略: XWPFDocument简介 XWPFDocument是Apache POI库中一个类,用于创建和读取Office Word文档。它可以让您使用Java代码来操作Word文档,包括创建、读取、修改和保存文档。 创建Word文档 以下是使用XWPFDo…

    other 2023年5月6日
    00
  • Android开发之App widget用法实例分析

    标题:Android开发之App widget用法实例分析 一、什么是App Widget App Widget 是 Android 系统提供的一种轻量级的应用组件,用于在桌面上显示有关应用程序的信息。它能够在桌面上完成部分应用的功能,而无需打开应用本身,非常方便用户。比如,我们可以使用一个 App Widget 显示当前天气情况或者显示某个网站的最新新闻等…

    other 2023年6月27日
    00
  • 使用AjaxPro.Net框架实现在客户端调用服务端的方法

    使用AjaxPro.Net框架可以方便地实现在客户端调用服务端的方法,具体的步骤如下: 步骤一:引入AjaxPro.Net框架 在项目中引入AjaxPro.Net框架的dll文件,并在Web.config中添加以下配置: <configuration> <system.web> <httpHandlers> <add…

    other 2023年6月27日
    00
  • IP地址与MAC地址的区别?

    IP地址与MAC地址的区别 IP地址和MAC地址是计算机网络中常用的两种地址类型,它们在网络通信中扮演不同的角色。下面将详细讲解它们的区别。 IP地址 IP地址(Internet Protocol Address)是用于在网络中唯一标识设备的地址。它是一个由32位或128位二进制数字组成的地址,用于在互联网上进行数据传输。IP地址分为IPv4和IPv6两种格…

    other 2023年7月30日
    00
  • react+antd 递归实现树状目录操作

    好的。首先,我们需要了解一下 react 和 antd 的基本知识。 React 是一个用于构建用户界面的 JavaScript 库,它提供了一种组件化的思想,让开发者可以将一个大型模块化的项目拆分成多个可嵌套、可复用、可独立开发的组件。而 antd 是一个基于 React 的 UI 组件库,提供了一系列常用的 UI 组件,如 Button、Modal、Ta…

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