C++ 中的继承类型 你应该知道什么?

已发表: 2023-04-05

你有没有想过一些流行的软件系统是如何构建的? 这都要归功于面向对象编程 (OOP) 中称为继承的强大机制。 继承允许程序员在现有类的基础上创建新类,从而实现代码重用和高效的软件开发。 想象一下,您正在构建一个需要多个类的系统,每个类都有一些共同的属性和行为。

无需重复编写相同的代码,您可以使用继承来创建基类并从中派生新类,从而节省您的时间和精力。

继承不仅高效而且通用。 在 C++ 中,有多种类型的继承,每种都有独特的优点和用例。

在本文中,我们将全面了解C++ 中的不同类型的继承,并在整篇文章中提供相关代码、解释和实际示例。

目录

C++ 中不同类型的继承

C++ 编程语言为其程序员提供了五种不同的继承选项。 根据上下文和要求,开发人员和程序员可以使用这些继承类型中的任何一种。

单一继承

单继承是 C++ 中最常见的继承类型。 在单继承中,派生类继承自单个基类。 这意味着一个类继承了基类的所有公共和受保护的数据成员和成员函数,同时具有添加自己的数据成员和成员函数的能力。

查看下面的代码片段,了解单继承的语法和理解:

// 基类

类动物{

民众:

空吃(){

std::cout << “动物正在吃东西” << std::endl;

}

};

//派生类

狗类:公共动物{

民众:

空树皮(){

std::cout << “狗在叫” << std::endl;

}

};

在这个例子中,我们有一个名为Animal的基类,它只有一个成员函数eat()。然后我们定义一个派生类Dog ,它公开继承自Animal Dog也有自己的成员函数 bark()。通过使用单继承,Dog可以访问Animal 类eat() 函数,并使用bark() 函数添加自己的行为

何时在 C++ 中使用单一继承

程序员可以使用单继承来创建派生类,为基类添加功能。

例如,您可以在创建涉及不同角色(例如战士、法师和弓箭手)的游戏时使用单一继承。 所有这些角色都有一些共同的属性和行为,例如生命值、攻击力和移动速度。 通过使用单继承,您可以创建一个名为 Character 的基类,其中包含公共属性和行为,并从中派生每个角色类以添加其独特的功能。

在多重继承中,一个派生类可以继承多个基类。 这意味着一个类可以有多个直接父类。 结果,派生类继承了每个基类的所有公共和受保护数据成员和成员函数。

下面是多重继承的例子:

// 基类 1

类形状{

民众:

虚拟双区() = 0;

};

// 基类 2

类颜色{

民众:

虚拟 std::string getColor() = 0;

};

//派生类

矩形类:公共形状,公共颜色{

民众:

双区域()覆盖{

返回宽度 * 高度;

}

std::string getColor() 覆盖 {

返回颜色;

}

私人的:

双倍宽度 = 5.0;

双倍高度 = 3.0;

std::string 颜色 = “蓝色”;

};

在这个例子中,我们有两个基类, Shape 和 Color ,每个基类都有它的虚函数。然后我们定义一个继承自 Shape 和 Color 的派生类Rectangle 。Rectangle覆盖了两个基类的虚函数以提供它自己的实现。通过使用多重继承,Rectangle可以继承两个基类ShapeColor的属性,以创建具有特定颜色和面积的矩形。

何时在 C++ 中使用多重继承

当您想要组合来自多个基类的功能时,请使用多重继承。 例如,考虑一个需要不同类型控件(例如按钮、复选框和文本框)的 GUI 应用程序。 每种控件类型都有其功能和行为,但它们也共享一些通用功能,例如处理用户事件和显示文本。

通过使用多重继承,您可以创建一个名为Control的包含通用功能的基类,并从中派生每个控件类型,以及包含其特定功能的其他基类。

在分层继承中,单个基类由多个派生类继承。 与多重继承一样,层次继承中的派生类获得基类的所有公共和保护数据成员和成员函数。

下面是一个代码片段,可以帮助您理解 C++ 中层次继承的实现:

// 基类

类动物{

民众:

虚空 makeSound() = 0;

};

// 派生类 1

猫类:公共动物{

民众:

void makeSound() 覆盖 {

std::cout << “喵” << std::endl;

}

};

// 派生类 2

狗类:公共动物{

民众:

void makeSound() 覆盖 {

std::cout << “Woof” << std::endl;

}

};

在这个例子中,我们有一个名为Animal的基类,它有一个虚函数makeSound()。然后我们定义两个派生类CatDog ,它们都继承自Animal 每个派生类都会覆盖makeSound()函数以提供自己的实现。 使用层次继承,我们可以创建具有共同行为(例如发出声音)的不同类型的动物。

何时在 C++ 中使用层次继承

当您想要创建共享公共功能的多个派生类时,请使用层次继承。 例如,考虑一个需要不同类型帐户(如储蓄帐户、支票帐户和信用卡帐户)的银行应用程序。 所有这些帐户类型都有一些共同的属性和行为,例如帐号、余额和利率。

通过使用分层继承,您可以创建一个名为 Account 的基类,其中包含公共属性和行为,并从中派生每个帐户类型以添加​​其独特的功能。

多级继承

C++中的多级继承是一种继承类型,其中一个派生类被另一个派生类继承。 在这种情况下,派生类继承了其直接父类的所有公共和受保护数据成员和成员函数,而直接父类又继承了自己的父类,依此类推。

以下是如何在 C++ 中以编程方式实现多级继承:

// 基类

类车辆{

民众:

无效开始(){

std::cout << “车辆正在启动” << std::endl;

}

};

// 中间类

类汽车:公共车辆{

民众:

无效驱动器(){

std::cout << “汽车正在行驶” << std::endl;

}

};

//派生类

类跑车:公共汽车{

民众:

无效加速(){

std::cout << “跑车正在加速” << std::endl;

}

};

何时在 C++ 中使用多级继承

当您想要创建一个继承自另一个派生类并添加其功能的派生类时,请使用多级继承。 例如,考虑一个软件系统需要不同类型的车辆,例如汽车、卡车和摩托车。 这些车辆类型具有一些共同的属性和行为,例如速度、加速度和制动。

通过使用多级继承,您可以创建一个名为Vehicle的基类,其中包含公共属性和行为,并从中派生中间类(例如CarTruck)以添加它们的特定功能。然后,您可以Car 类派生SportsCar 类以添加其独特的功能。

混合继承是两种或多种继承类型的组合。 也称为虚拟继承,混合继承中的一个派生类继承自多个基类,其中一些基类是通过多条路径继承的。 这会创建复杂的继承层次结构,并且难以理解和维护。

查看 upGrad 的软件开发课程来提高自己的技能。

下面是C++ 中混合继承的示例

// 基类 1

类动物{

民众:

虚空 makeSound() = 0;

};

// 基类 2

类 CanFly {

民众:

虚空飞行()= 0;

};

// 基类 3

类 CanSwim {

民众:

虚拟无效游泳()= 0;

};

//派生类

蝙蝠类:公共动物,公共 CanFly {

民众:

void makeSound() 覆盖 {

std::cout << “尖叫!”<< 标准::结束;

}

空飞()覆盖{

std::cout << “蝙蝠在飞” << std::endl;

}

};

//派生类

企鹅类:公共动物,公共 CanSwim {

民众:

void makeSound() 覆盖 {

std::cout << “胡克!”<< 标准::结束;

}

无效游泳()覆盖{

std::cout << “企鹅在游泳” << std::endl;

}

};

探索我们的热门软件工程课程

LJMU & IIITB 计算机科学硕士 加州理工学院 CTME 网络安全证书课程
全栈开发训练营 区块链PG项目
全栈开发中的执行 PG 计划
在下面查看我们所有的课程
软件工程课程

何时在 C++ 中使用混合继承

除了前面讨论的四种继承类型之外,混合继承在某些需要多种继承类型的场景中也很有用。 使用混合继承来组合多种继承类型的优点。

例如,考虑一个需要不同类型动物的软件系统,其中一些可以飞,而另一些可以游泳。 您可以使用混合继承来创建一个名为Animal的基类,并从中派生两个中间类CanFlyCanSwim 最后,使用混合继承,您可以从两个中间类派生BatPenguin类。 Bat继承自AnimalCanFly ,而Penguin类继承自AnimalCanSwim 这样,您就可以创造出具有独特能力组合的不同类型的动物。

C++ 中的混合继承在需要多种继承类型的复杂软件系统中非常有用。 但是,它也会创建复杂的继承层次结构,难以理解和维护。 与其他类型的继承一样,为您的特定软件开发项目要求和设计目标选择正确的类型是至关重要的。

阅读我们与软件开发相关的热门文章

查看我们的免费技术课程,在竞争中脱颖而出。

使用继承时要记住的重要事项:

虽然继承是 C++ 中的一种强大机制,但在实现时也有一些因素需要考虑。

  1. 避免深继承层次结构:深继承层次结构会导致代码难以阅读、理解和维护。使您的继承层次结构尽可能浅,以提高代码的可读性和可维护性。
  2. 明智地使用访问修饰符:访问修饰符(public、protected 和 private)控制类中数据成员和成员函数的可见性。明智地使用它们以避免暴露不应在类外部可见的实现细节。
  3. 避免菱形继承:当一个类继承自两个继承自同一基类的类时,就会发生菱形继承。这会导致歧义,通常最好避免。
  4. 避免过度使用继承:虽然继承很有用,但避免过度使用它很重要。在某些情况下,组合或其他设计模式可能是更好的选择。

探索我们的软件开发免费课程

云计算基础 从零开始的 JavaScript 基础 数据结构和算法
区块链技术 初学者反应 核心 Java 基础知识
爪哇 初学者的 Node.js 高级JavaScript

带走

总而言之,继承是C++编程中一个至关重要的概念,每个编程学生都应该掌握。 通过了解不同类型的继承及其用例,您可以创建高效、有组织且可维护的代码,从而成为更好的软件开发人员。

如果您觉得这篇文章很有趣,您可以通过注册upGrad与 IIIT Bangalore 合作提供的 DevOps 认证计划来进一步增强您的软件开发知识。 本课程涵盖软件开发的各个方面,包括编码、测试和部署,可以帮助您成为业内熟练的软件开发人员。

为什么继承在 C++ 编程中很重要?

利用继承,程序员可以节省软件开发的时间和精力,有条理地构建复杂的软件系统。 随着程序员努力创建更具可读性的代码,编码过程简化为流形。

在 C++ 编程中使用继承时要记住哪些重要事项?

在 C++ 编程中使用继承时,必须牢记一些关键事项,例如避免深度继承层次结构、明智地使用访问修饰符、避免菱形继承以及不要过度使用继承。

我的软件开发项目应该使用哪种类型的继承?

选择正确的继承类型取决于您特定的软件开发项目要求和设计目标。 从各种继承中进行选择完全取决于您的项目要求。 因此,在继续之前进行详细分析。