• c++学习:继承


    目录

    特点

    基本用法

    实例

    基类:Animal

    派生类:Lion

    派生类:Elephant

    派生类:Bird

    使用这些类

    权限对继承的影响

    示例

    基类构造函数

    示例


    继承是面向对象编程(OOP)中的一个核心概念,特别是在C++中。它允许一个类(称为派生类或子 类)继承另一个类(称为基类或父类)的属性和方法。继承的主要目的是实现代码重用,以及建立一种 类型之间的层次关系。

    特点

    • 代码重用:子类继承了父类的属性和方法,减少了代码的重复编写。
    • 扩展性:子类可以扩展父类的功能,添加新的属性和方法,或者重写(覆盖)现有的方法。
    • 多态性:通过继承和虚函数,C++支持多态,允许在运行时决定调用哪个函数。

    基本用法

    继承可以是公有(public)、保护(protected)或私有(private)的,这决定了基类成员在 派生类中的访问权限

    1. #include
    2. using namespace std;
    3. //基类,父类
    4. class Vehicle{ //交通工具,车,抽象的概念
    5. public:
    6. string type;
    7. string contry;
    8. string color;
    9. double price;
    10. int numOfWheel;
    11. void run(){
    12. cout << "车跑起来了" << endl;
    13. }
    14. void stop();
    15. };
    16. //派生类,子类
    17. class Bickle : public Vehicle{
    18. };
    19. //派生类,子类
    20. class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
    21. public:
    22. int stateOfTop;
    23. void openTopped();
    24. void pdrifting();
    25. };
    26. int main()
    27. {
    28. Roadster ftype;
    29. ftype.type = "捷豹Ftype";
    30. ftype.run();
    31. Bickle bike;
    32. bike.type = "死飞";
    33. bike.run();
    34. return 0;
    35. }

    Vehicle 类公有地继承自 Vehicle 类,这意味着所有 Vehicle 类的公有成员在 Vehicle 类中也是公有的

    实例

    我们有一个基类 Animal ,它定义了所有动物共有的特性和行为。然 后,我们可以创建几个派生类,如 Lion 、 Elephant 和 Bird ,这些类继承自 Animal 类,并添加或 修改特定于它们自己的特性和行为

    基类:Animal

    1. #include <iostream>
    2. #include <string>
    3. class Animal {
    4. protected:
    5. std::string name;
    6. int age;
    7. public:
    8. Animal(std::string n, int a) : name(n), age(a) {}
    9. virtual void makeSound() {
    10. std::cout << name << " makes a sound." << std::endl;
    11. }
    12. virtual void display() {
    13. std::cout << "Animal: " << name << ", Age: " << age << std::endl;
    14. }
    15. };

    派生类:Lion

    1. class Lion : public Animal {
    2. public:
    3. Lion(std::string n, int a) : Animal(n, a) {}
    4. void makeSound() override {
    5. std::cout << name << " roars." << std::endl;
    6. }
    7. void display() override {
    8. std::cout << "Lion: " << name << ", Age: " << age << std::endl;
    9. }
    10. };

    派生类:Elephant

    1. class Elephant : public Animal {
    2. public:
    3. Elephant(std::string n, int a) : Animal(n, a) {}
    4. void makeSound() override {
    5. std::cout << name << " trumpets." << std::endl;
    6. }
    7. void display() override {
    8. std::cout << "Elephant: " << name << ", Age: " << age << std::endl;
    9. }
    10. };

    派生类:Bird

    1. class Bird : public Animal {
    2. public:
    3. Bird(std::string n, int a) : Animal(n, a) {}
    4. void makeSound() override {
    5. std::cout << name << " sings." << std::endl;
    6. }
    7. void display() override {
    8. std::cout << "Bird: " << name << ", Age: " << age << std::endl;
    9. }
    10. };

    使用这些类

    1. int main() {
    2. Lion lion("Leo", 5);
    3. Elephant elephant("Ella", 10);
    4. Bird bird("Bella", 2);
    5. lion.display();
    6. lion.makeSound();
    7. elephant.display();
    8. elephant.makeSound();
    9. bird.display();
    10. bird.makeSound();
    11. return 0;
    12. }
    • Animal 是基类,定义了所有动物共有的属性(如 name 和 age )和方法(如 makeSound 和 display )。
    • Lion 、 Elephant 和 Bird 是派生类,它们继承了 Animal 的特性,并根据自身的特性重写了 makeSound 和 display 方法。
    • 在 main 函数中,创建了各种动物的实例,并展示了它们的行为。

    权限对继承的影响

    • public 继承:基类的 public 成员在派生类中仍然是 public 的, protected 成员仍然是 protected 的。基类的 private 成员在派生类中不可访问。
    • protected 继承:基类的 public 和 protected 成员在派生类中都变成 protected 的。基类 的 private 成员在派生类中不可访问。
    • private 继承:基类的 public 和 protected 成员在派生类中都变成 private 的。基类的 private 成员在派生类中不可访问。

    示例

    1. #include <iostream>
    2. using namespace std;
    3. //基类,父类
    4. class Vehicle{ //交通工具,车,抽象的概念
    5. public:
    6. string type;
    7. string contry;
    8. string color;
    9. double price;
    10. int numOfWheel;
    11. protected:
    12. int protectedData;
    13. private:
    14. int privateData;
    15. public:
    16. void run(){
    17. cout << "车跑起来了" << endl;
    18. }
    19. void stop();
    20. };
    21. //私有继承测试
    22. class TestClass : private Vehicle{
    23. public:
    24. void tsetFunc(){
    25. price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用
    26. }
    27. };
    28. //公有继承测试
    29. class Truck : protected Vehicle{
    30. public:
    31. void testFunc(){
    32. type = "数据测试"; //编程了公有权限
    33. protectedData = 10; //保持公有权限
    34. privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。
    35. }
    36. };
    37. //公有继承,基类的公有权限和保护权限不变,私有成员不能访问
    38. class Bickle : public Vehicle{
    39. public:
    40. void testFunc(){
    41. protectedData = 10;
    42. }
    43. };
    44. //派生类,子类
    45. class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
    46. public:
    47. int stateOfTop;
    48. void openTopped();
    49. void pdrifting();
    50. };
    51. int main()
    52. {
    53. TestClass test;
    54. test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限
    55. Truck t;
    56. t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限
    57. t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限
    58. Roadster ftype;
    59. ftype.type = "捷豹Ftype";
    60. ftype.run();
    61. Bickle bike;
    62. bike.type = "死飞";
    63. bike.run();
    64. return 0;
    65. }

    基类构造函数

    派生类可以通过其构造函数的初始化列表来调用基类的构造函数。这是在构造派生类对象时初 始化基类部分的标准做法

    当创建派生类的对象时,基类的构造函数总是在派生类的构造函数之前被调用。如果没有明确指定,将 调用基类的默认构造函数。如果基类没有默认构造函数,或者你需要调用一个特定的基类构造函数,就 需要在派生类构造函数的初始化列表中明确指定

    示例

    假设我们有一个基类 Base 和一个派生自 Base 的类 Derived

    1. class Base {
    2. public:
    3. int data;
    4. Base(int x) {
    5. std::cout << "Base constructor with x = " << x << std::endl;
    6. }
    7. };
    8. class Derived : public Base {
    9. public:
    10. double ydata;
    11. Derived(int x, double y) : Base(x) { // 调用 Base 类的构造函数
    12. std::cout << "Derived constructor with y = " << y << std::endl;
    13. }
    14. };
    15. int main() {
    16. Derived obj(10, 3.14); // 首先调用 Base(10),然后调用 Derived 的构造函数
    17. return 0;
    18. }
    • Base 类有一个接受一个整数参数的构造函数。
    • Derived 类继承自 Base ,它的构造函数接受一个整数和一个双精度浮点数。在其初始化列表中, 它调用 Base 类的构造函数,并传递整数参数。
    • 当 Derived 类的对象被创建时,首先调用 Base 类的构造函数,然后调用 Derived 类的构造函 数。

     

  • 相关阅读:
    密码学【一】
    10个提高VS Code工作效率的技巧
    The Sandbox 和 Brinc 公布入选 5000 万美元元宇宙加速器计划的首批初创公司
    会声会影2023永久激活序列号密钥(支持各版本会声会影注册机)
    [Python]Flask简介与gunicorn部署
    Windows ADK使用场景之一:应用程序兼容性工具。解决普通域用户执行软件时,提示要管理员账号与密码问题!
    js:防抖、节流(闭包)
    app毕业设计开题报告-基于Uniapp实现的移动端的医生挂号就诊平台
    无法上网问题解决过程
    kunpeng的aarch64架构cpu、openeuler系统、昇腾服务器适配文档转换功能(doc转docx、ppt转pptx)
  • 原文地址:https://blog.csdn.net/weixin_59669309/article/details/136371137