C++ 继承和多态详解
创作时间:
2025-03-11 12:34:31
作者:
@小白创作中心
C++ 继承和多态详解
引用
CSDN
1.
https://m.blog.csdn.net/Tiantangbujimo7/article/details/145320530
C++中的继承和多态是面向对象编程的重要特性,它们允许开发者创建结构合理、灵活且易于维护的代码。本文将详细介绍继承的类型、多态的概念以及如何实现不可继承的类。
继承
继承是一种面向对象编程的重要特性,它允许你创建一个新的类,从一个或多个现有的类中继承属性的行为。这个新的类被称为派生类(Derived Class),而被继承的类称之为基类(Base Class)。继承所研究的是类与类之间的依赖关系,是多个类直接的共性与个性直接的代码表达。让代码结构更加合理,灵活,易于维护。
单继承
单继承是最基本的继承方式,一个派生类只能继承一个基类。
class BaseClass {};
class Derive : public BaseClass { };
多继承
多继承允许一个派生类继承多个基类。但是,多继承可能会导致一些复杂的问题,如菱形继承问题。
#include <iostream>
using namespace std;
// 基类 Animal
class Animal {
public:
void eat() {
cout << "This animal is eating." << endl;
}
void sleep() {
cout << "This animal is sleeping." << endl;
}
};
// 基类 Bird
class Bird {
public:
void fly() {
cout << "This bird is flying." << endl;
}
void nest() {
cout << "This bird is building a nest." << endl;
}
};
// 基类 Predator
class Predator{
public:
void hunt() {
cout << "This bird is hunt." << endl;
}
};
// 派生类 Eagle
class Eagle : public Animal, public Bird, public Predator{
public:
void hunt() {
cout << "This eagle is hunting." << endl;
}
};
int main() {
Eagle eagle;
eagle.eat(); // 从 Animal 类继承
eagle.fly(); // 从 Bird 类继承
eagle.hunt(); // Eagle 类自己的方法
return 0;
}
菱形继承
菱形继承是一种特殊的多继承情况,可能会导致一些复杂的问题。
class Animal {};
class Horse :public Animal {};
class Donkey :public Animal {};
class Mule :public Horse,public Donkey {};
在实际的业务设计时,往往将共性的东西设计为基类,将个性化的东西,设计在派生类里。
多态
多态是面向对象编程的另一个重要特性,它允许使用一个接口来表示多种类型。多态可以分为静态多态和动态多态。
静态多态
静态多态在编译时就确定,主要包括函数重载和运算符重载。
动态多态
动态多态在运行时确定,主要包括虚函数和继承对象之间的指针与引用。
如何实现一个不可以被继承的类
有时候,我们可能希望创建一个不能被继承的类。以下是两种实现方法:
- 使用 C++11 的
final
关键字
class A final{};
这个类将不能被继承。
- 使用 private 或 protected 构造函数来防止继承
将类的构造函数声明为 private 或 protected 可以避免该类被继承。这样可以防止外部代码直接创建该类的派生类实例。
class NonInheritable {
private:
// 将构造函数设为私有,禁止派生类调用
NonInheritable() {}
public:
void showMessage() {
cout << "This class cannot be inherited due to private constructor." << endl;
}
static NonInheritable create() {
return NonInheritable(); // 提供静态方法创建对象
}
};
// 尝试继承会报错,因为构造函数是私有的
class Derived : public NonInheritable {
public:
void anotherMessage() {
cout << "This will not compile." << endl;
}
};
调用 Derived
将会报错:
E1790 无法引用 "Derived" 的默认构造函数
热门推荐
夏季防暑安全指南
小说写不出来怎么办?只有侦探作家知道答案
老年人穿啥衣服好看?轻松打造时尚与舒适兼备的穿搭!
司马光反对王安石:政治立场与理念之争
春节期间高发的22种电信网络诈骗套路、十条防骗秘籍、“三不一要”
体味种类全解析:了解你身体的独有气味
交通肇事破坏现场的法律责任与司法认定
FPGA开发全攻略——IP核
房产分户转移登记:法律实务操作指南
易经起名原理:基于阴阳五行的命名智慧
醋泡脚的功效与作用有哪些
工地管理员安全交底指南:从流程规范到数字化管理
麻仁润肠丸的正确用法
国足迎战澳队丨DeepSeek预测国足晋级2026世界杯概率约5%-15%
科学施肥助力草莓高产优质——详解草莓生长各阶段施肥要点
什么是有潜力的金融投资趋势跟踪方法?这个方法有什么挑战?
如何使用任务管理器提高工作效率?
超声波焊接机的原理与应用全面解析
混合动力汽车节能机理及节能途径解析
海盐:常见用途、潜在好处与风险
单频WiFi和双频WiFi有什么区别
数据仓库架构设计指南
企业异地组网宽带用IPLC还是SD-WAN?
射手深情吗?深入探讨射手座的情感特质与爱情观
中国队奥运史上奖牌最多的张雨霏:只有面对它,你才有机会战胜它
从直播间到产业带:电商如何撬动饶河边城经济?
从 8GB 到 1TB:手机内存、缓存与存储空间,90% 的人没搞懂
回南天空调除湿的效用与专业除湿机的必要性
Wi-Fi 8的最新进展及其对智能家居的影响
佛教视角下的量子世界与心物不二