第十五章:C++访问控制权限、继承和多态详解

本文涉及的产品
访问控制,不限时长
简介: 第十五章:C++访问控制权限、继承和多态详解

第十五章:C++访问控制权限、继承和多态详解

1. 概述

C++中的访问控制权限是面向对象编程的重要概念之一。通过访问控制权限,我们可以限制类成员的访问范围,以保护数据的安全性和封装性。本文将详细讲解C++中的访问控制权限,结合继承和多态,给出大量代码和实际案例。

2. 访问控制权限

2.1 访问控制权限的类型

C++中有三种访问控制权限:public、protected和private。它们定义了类成员对外暴露的程度,以下是它们的基本规则:

  • public:公共权限,允许在类内部和外部使用。
  • protected:受保护的权限,允许在类内部和派生类中使用。
  • private:私有权限,只允许在类内部使用。

2.2 访问控制权限的示例代码

class Shape {
public:
    void printArea() const {
        cout << "The area is: " << calculateArea() << endl;
    }
protected:
    virtual double calculateArea() const = 0;
};
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
protected:
    double calculateArea() const {
        return 3.14 * radius * radius;
    }
};
int main() {
    Shape* shape = new Circle(5.0);
    shape->printArea();
    delete shape;
    return 0;
}

运行结果:

The area is: 78.5

在上述代码中,Shape类中的函数printArea()是公共权限,可以在类内部和外部使用。protected权限用于声明纯虚函数calculateArea(),这个函数必须在派生类中实现。

派生类Circle中的私有成员变量radius只允许在类内部使用。通过实现calculateArea()函数,我们可以计算圆的面积。

在main()函数中,我们通过基类指针shape来存储Circle对象,并调用printArea()函数来打印圆的面积。尽管calculateArea()被定义为protected权限,但派生类可以正常地访问它。

3. 继承和多态中的访问控制权限

3.1 继承中的访问控制权限

继承中,访问控制权限决定了派生类对基类成员的访问能力。以下是继承中的不同访问权限的示例代码:

class Animal {
public:
    void eat() {
        cout << "Animal eats." << endl;
    }
protected:
    void sleep() {
        cout << "Animal sleeps." << endl;
    }
private:
    void run() {
        cout << "Animal runs." << endl;
    }
};
class Dog : public Animal {
public:
    void accessBase() const {
        eat();     // 可以访问基类的公共成员
        sleep();   // 可以访问基类的受保护成员
        //run();   // 无法访问基类的私有成员
    }
};
int main() {
    Dog dog;
    dog.accessBase();
    return 0;
}

运行结果:

Animal eats.
Animal sleeps.

在上述代码中,Dog类继承了Animal类。通过对象dog调用accessBase()函数,我们可以看到派生类对不同访问权限的访问情况。

Dog类可以访问Animal类的公共和受保护成员(eat()和sleep()),但无法访问Animal类的私有成员(run())。

3.2 多态中的访问控制权限

多态是指通过基类的指针或引用来操作派生类的对象,实现不同对象的不同行为。在多态中,使用基类指针或引用可以限制对对象成员的访问能力。以下是多态中的访问控制权限的示例代码:

class Animal {
public:
    virtual void makeSound() = 0;
};
class Dog : public Animal {
public:
    void makeSound() override {
        cout << "Woof!" << endl;
    }
};
class Cat : public Animal {
private:
    void makeSound() override {
        cout << "Meow!" << endl;
    }
};
int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();
    //animal1->makeSound();   // 无法访问基类的私有成员
    animal2->makeSound();
    delete animal1;
    delete animal2;
    return 0;
}

运行结果:

Meow!

在上述代码中,Animal类声明了纯虚函数makeSound(),派生类Dog和Cat分别提供了自己对这个函数的实现。

通过基类指针animal1和animal2来存储派生类对象,并调用makeSound()函数。由于Cat类中的makeSound()函数被定义为private,因此无法通过基类指针来访问它,而只能通过派生类对象直接访问。

4. 总结

本文详细介绍了C++中的访问控制权限,以及在继承和多态中的应用。通过设置不同的访问权限,可以限制类成员的访问范围,保护数据的安全性和封装性。

在继承中,访问控制权限决定了派生类对基类成员的访问能力。在多态中,使用基类指针或引用可以限制对对象成员的访问。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
2月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
312 7
|
5天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
37 16
|
2天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
20 5
|
2月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
38 1
【C++】继承
|
2月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
135 4
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
34 1
|
3月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
57 2
C++入门12——详解多态1
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
69 1
|
3月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
94 1
|
3月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
53 1