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

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

1. 概述

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

2. 访问控制权限

2.1 访问控制权限的类型

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

  • 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(),派生类DogCat分别提供了自己对这个函数的实现。

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

4. 总结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值