C++ 继承和多态详解
创作时间:
作者:
@小白创作中心
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" 的默认构造函数
热门推荐
在中国,涉外仲裁的费用是多少?
八字命理:丁火日主的命运特征与职业建议
7个常见误区:项目管理核心内容的正确理解
安兔兔公布中国安卓手机性价比排名,小米15未入前五
基督徒信生辰八字起名吗?从圣经角度看生辰八字与基督教信仰的冲突
微信过期的文件如何恢复?5种方法恢复文件,存起来以防万一!
您知道怎么使用逃生绳逃生吗?
弦理论是什么?
百合花从外到内都有哪些结构
百合花怎么结种子
同理心培养:教育孩子理解他人感受,建立和谐人际关系
活性维生素D效果更好?关键是用对!3 种抗骨质疏松药物的使用区别,一次讲清
石墨烯的潜力 – 世界上最坚硬的材料
生藕和熟藕的食疗功效有何异同?如何根据个人需求选择合适的食用方式?
左肩冈上肌腱损伤怎么治疗效果好
肺部手术后痰中带血的常见原因
如何正确使用车载对讲机?使用车载对讲机时需要遵守哪些规定?
选购适合你的机械键盘指南:从预算、轴体到键帽全方位解析
如何成为AI算法工程师?
授权委托书格式概述
销售助理的主要工作职责是什么?
如何用软件测试手机屏幕
影响关键词优化报价的六大因素及解决方案
如何整理报价清单数据库
物联卡解决方案在不同场景的应用案例
FlowJo导出Excel格式的多种方法详解
诸葛亮火烧新野:历史真相与文学演绎的辨析
CFR – 成本加运费
低蛋白血症的临床表现及危害
马蜂窝的功效与作用