如何通过示例使用 C++ 单继承和多继承

举报
Tiamo_T 发表于 2021/09/29 13:26:58 2021/09/29
2.6k+ 0 0
【摘要】 继承是一个类可以继承另一个类的数据成员和函数的属性。在这种情况下,被继承的类称为基类,而继承的类称为派生类或子类。在这里,让我们通过一个示例程序来学习 C++ 编程中继承的概念。以下是如何进行继承的示例:class fourwheeler{public: int category; int eurolevel; int getCategory(void); char ...

继承是一个类可以继承另一个类的数据成员和函数的属性。

在这种情况下,被继承的类称为基类,而继承的类称为派生类或子类。

在这里,让我们通过一个示例程序来学习 C++ 编程中继承的概念。

以下是如何进行继承的示例:

class fourwheeler
{
public:
    int category;
    int eurolevel;

    int getCategory(void);
    char getEuroLevel(void);
};  

class car : public fourwheeler
{
public :
    char* brand;
    char* model;

    char* getBrand(void);
    char* getModel(void);
};

所以我们看到有一个名为“fourwheeler”的类,它是由类“car”公开派生的。这实际上是有道理的,因为实际上汽车也应该具有四轮车的所有通用特征。因此,就 C++ 编程而言,一旦我们创建了一个“四轮车”类,它的成员就可以在任何特定的四轮车类别类(如汽车)中重用。通过这种方式,C++ 使您能够重用任何所需的代码。这也有助于保持代码简单和可维护。

您可能想知道(或可能在这里错过)的一件事是我在最后一段中使用了“公开衍生”一词。我们的意思是什么?好吧,正如我们在 C++ 介绍文章中讨论的那样,存在三个访问说明符,即 public、private 和 protected。在派生类时,这些说明符用于传达所有需要继承的内容以及以何种方式继承。

以下是您需要记住的三点:


  • 如果基类是公开派生的,则基类的公共成员成为派生类的公共成员。同样,基类的受保护成员成为派生类的受保护成员。但是,基类的私有成员不会被继承。
  • 如果基类在保护模式下派生,则基类的公共成员和受保护成员都将成为派生类的受保护成员。但是,基类的私有成员不会被继承。
  • 如果基类以私有模式派生,则基类的公共成员和受保护成员都将成为派生类的私有成员。但是,如果基类没有被继承,私有成员也是如此。

回到上面的例子,让我们使用公共继承来完成它:

#include<iostream>

class fourwheeler
{
public:
    int category;
    int eurolevel;

    inline int getCategory(void)
    {
        return category;
    }
    inline char getEuroLevel(void)
    {
        return eurolevel;
    }
};

class car : public fourwheeler
{
public :
    char* brand;
    char* model;

    char* getBrand(void);
    char* getModel(void);
};

int main(void)
{
    car obj_car;
    obj_car.category = 1;
    obj_car.eurolevel = 3;

    std::cout <<"\n The fourwheeler category is "<<obj_car.category;
    std::cout << "\n The fourwheeler eurolevel is "<<obj_car.eurolevel<<"\n";
    return 0;
}

现在,当这段代码被编译和执行时,输出如下:

$ ./inheritance 

 The fourwheeler category is 1
 The fourwheeler eurolevel is 3

所以我们看到“fourwheeler”类的公共成员很容易作为“car”类的公共成员访问。类似地,我们可以使用 protected 和 private 访问说明符进行 protected 和 private 继承。

这里要理解的一件重要事情是如何决定是否需要公共或受保护或私有继承?这是答案:

  • 当继承是公共的时,派生类和其他任何主体都可以通过派生类访问基类的公共成员,因为这些成员现在成为派生类的公共成员。那么,由您决定是否需要这种可见性?
  • 当继承受到保护时,只有派生类及其子类可以访问这些成员,因为这些成员现在成为派生类的受保护成员。除了它们之外,没有其他人可以直接访问它们。因此,再次由您决定是否需要这种可见性。
  • 类似地,当继承是私有的时,只有派生类可以访问这些成员,因为这些成员现在成为派生类的私有成员,因此无法进一步派生。此外,没有其他人可以使用它们。因此,再次由您决定何时选择私有继承。

继续前进,我们刚才讨论的示例代表单继承。也可以有多重继承。这意味着单个类可以同时从多个类继承。这是一个例子:

#include<iostream>

class sedans
{
public:
    int total_num_sedans;
    int in_production_sedans;
    int ready_sedans;

    int get_total_num_sedans(void)
    {
        return total_num_sedans;
    }
    int get__num_sedans_in_production(void)
    {
        return in_production_sedans;
    }
    int get_num_sedans_ready(void)
    {
        return ready_sedans;
    }
};

class suvs
{
public:
    int total_num_suvs;
    int in_production_suvs;
    int ready_suvs;

    int get_total_num_suvs(void)
    {
        return total_num_suvs;
    }
    int get__num_suvs_in_production(void)
    {
        return in_production_suvs;
    }
    int get_num_suvs_ready(void)
    {
        return ready_suvs;
    }
};

class honda : public sedans, public suvs
{
public :
    int ovrall_total_cars;
    int ovrall_total_production;
    int ovrall_total_ready;

    int get_ovrall_num_cars(void)
    {
        return (ovrall_total_cars = total_num_suvs + total_num_sedans);
    }
    int get_ovrall_in_production(void)
    {
        return (ovrall_total_production = in_production_suvs + in_production_sedans);
    }
    int get_ovrall_ready(void)
    {
        return (ovrall_total_ready = ready_suvs + ready_sedans);
    }

};   

int main(void)
{
    honda cmpny_stats;

    cmpny_stats.total_num_sedans = 5;
    cmpny_stats.total_num_suvs = 10;

    std::cout<<"\n Overall honda cars = "<<cmpny_stats.get_ovrall_num_cars()<<"\n";
    return 0;
}

这是上面代码的输出:

Overall honda cars = 15

所以我们看到,通过多重继承,本田类能够同时继承轿车类和SUV类。

最后,请注意构造函数、析构函数、友元函数和重载运算符不能被继承。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。