亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 继承

C++ 继承

在本教程中,我们将通过示例了解 C++ 中的继承。

继承是 C++ 中面向对象编程的关键特性之一。它允许我们从现有的类(基类)创建一个新的类(派生类)。

派生类继承基类的特性 并且可以有自己的附加功能。例如,

class Animal {
    // eat() function
    // sleep() function
};

class Dog : public Animal {
    // bark() function
};

这里,Dog 类派生自 Animal 班级。从 Dog 派生自 Animal , Animal 的成员 Dog 可以访问 .

<图>

注意关键字 public 的使用 同时从 Animal 继承 Dog。

class Dog : public Animal {...};

我们也可以使用关键字privateprotected 而不是 public .我们将了解使用 private 之间的区别 , publicprotected 本教程的后面部分。


is-a 关系

继承是一种是一种关系 .我们仅在 is-a 关系 时使用继承 存在于两个类之间。

以下是一些例子:


示例1:C++继承的简单示例

// C++ program to demonstrate inheritance

#include <iostream>
using namespace std;

// base class
class Animal {

   public:
    void eat() {
        cout << "I can eat!" << endl;
    }

    void sleep() {
        cout << "I can sleep!" << endl;
    }
};

// derived class
class Dog : public Animal {
 
   public:
    void bark() {
        cout << "I can bark! Woof woof!!" << endl;
    }
};

int main() {
    // Create object of the Dog class
    Dog dog1;

    // Calling members of the base class
    dog1.eat();
    dog1.sleep();

    // Calling member of the derived class
    dog1.bark();

    return 0;
}

输出

I can eat!
I can sleep!
I can bark! Woof woof!!

在这里,dog1 (派生类的对象Dog ) 可以访问基类 Animal 的成员 .这是因为 Dog 继承自 Animal .

// Calling members of the Animal class
dog1.eat();
dog1.sleep();

C++ 保护成员

访问修饰符 protected 在涉及 C++ 继承时尤其重要。

喜欢 private 成员,protected 成员在类之外是不可访问的。但是,它们可以通过派生类访问 和朋友类/功能 .

我们需要 protected 成员,如果我们想隐藏一个类的数据,但仍然希望该数据被其派生类继承。

要了解有关受保护的更多信息,请参阅我们的 C++ 访问修饰符教程。


示例 2:C++ 保护成员

// C++ program to demonstrate protected members

#include <iostream>
#include <string>
using namespace std;

// base class
class Animal {

   private:
    string color;

   protected:
    string type;

   public:
    void eat() {
        cout << "I can eat!" << endl;
    }

    void sleep() {
        cout << "I can sleep!" << endl;
    }

    void setColor(string clr) {
        color = clr;
    }

    string getColor() {
        return color;
    }
};

// derived class
class Dog : public Animal {

   public:
    void setType(string tp) {
        type = tp;
    }

    void displayInfo(string c) {
        cout << "I am a " << type << endl;
        cout << "My color is " << c << endl;
    }

    void bark() {
        cout << "I can bark! Woof woof!!" << endl;
    }
};

int main() {
    // Create object of the Dog class
    Dog dog1;

    // Calling members of the base class
    dog1.eat();
    dog1.sleep();
    dog1.setColor("black");

    // Calling member of the derived class
    dog1.bark();
    dog1.setType("mammal");

    // Using getColor() of dog1 as argument
    // getColor() returns string data
    dog1.displayInfo(dog1.getColor());

    return 0;
}

输出

I can eat!
I can sleep!
I can bark! Woof woof!!
I am a mammal
My color is black

这里,变量 typeprotected 因此可以从派生类 Dog 访问 .我们可以看到这一点,因为我们已经初始化了 typeDog 使用函数 setType() 的类 .

另一方面,private 变量颜色 无法在 Dog 中初始化 .

class Dog : public Animal {

    public:
      void setColor(string clr) {
          // Error: member "Animal::color" is inaccessible
          color = clr; 
      }
};

另外,由于 protected 关键字隐藏数据,我们无法访问 type 直接来自 Dog 的对象 或 Animal 类。

// Error: member "Animal::type" is inaccessible
dog1.type = "mammal";

C++ 继承中的访问模式

在我们之前的教程中,我们了解了 C++ 访问说明符,例如 public、private 和 protected。

到目前为止,我们已经使用了 public 关键字,以便从先前存在的基类继承类。但是,我们也可以使用 privateprotected 继承类的关键字。例如,

class Animal {
    // code
};

class Dog : private Animal {
    // code
};
class Cat : protected Animal {
    // code
};

我们可以派生类的各种方式称为访问模式 .这些访问模式的作用如下:

  1. 公开: 如果在 public 中声明了派生类 模式,那么基类的成员就照原样被派生类继承。
  2. 私人: 在这种情况下,基类的所有成员都变为 private 派生类中的成员。
  3. 受保护: public 基类的成员变为 protected 派生类中的成员。

private 基类的成员总是 private 在派生类中。

要了解更多信息,请访问我们的 C++ 公有、私有、受保护的继承教程。


继承中的成员函数重写

假设基类和派生类有同名同参数的成员函数。

如果我们创建派生类的对象并尝试访问该成员函数,则会调用派生类中的成员函数,而不是基类中的成员函数。

派生类的成员函数覆盖基类的成员函数。

详细了解 C++ 中的函数覆盖。


推荐阅读: C++ 多重继承


C语言

  1. C# 静态关键字
  2. C# 嵌套类
  3. C++ 运算符
  4. C++ 类和对象
  5. C++ 公共、受保护和私有继承
  6. C++ 类模板
  7. Python 继承
  8. C++ 中的存储类
  9. C++中的多态性
  10. C++ 中的数据抽象
  11. C++ 中的数据封装
  12. C++ 中的接口(抽象类)