当前位置: 首页 > article >正文

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;
    }
};

// 基类 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 {};

在实际的业务设计时,往往将共性的东西 设计为基类,将个性化的东西,设计在派生类里。

多态

静态多态

  • 函数重载
  • 运算符重载

动态多态

  • 虚函数
  • 继承对象之间的指针 & 引用

练一练:

如何实现一个不可以被继承的类

1.使用 C++ 11 final 关键字

class A final{};
这个类将不能被继承

2.使用 privete 或 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" 的默认构造函数


http://www.kler.cn/a/525991.html

相关文章:

  • Golang笔记——常用库context和runtime
  • .Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
  • sem_init的概念和使用案例
  • 16.Word:石油化工设备技术❗【28】
  • Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)
  • 论文阅读(十三):复杂表型关联的贝叶斯、基于系统的多层次分析:从解释到决策
  • Docker小游戏 | 使用Docker部署FC-web游戏模拟器
  • 顺启逆停程序
  • cursor软件的chat和composer分别是什么
  • 9 Spark性能优化_RDD算子调优
  • 再谈多组学(multi-omics)
  • Cloudreve:Star22.3k,免费开源的网盘,支持多种存储方式,它允许用户快速搭建个人或团队的私有云存储服务。
  • 数据结构与算法学习笔记----容斥原理
  • 基于Java+Swing实现推箱子游戏
  • [Effective C++]条款49-52 内存分配
  • Linux运维之Linux的安装和配置
  • 我的2024年博客总结(在工作、博客和生活中找到自己的生活节奏)
  • 创建前端项目的方法
  • Baklib引领内容管理平台新时代优化创作流程与团队协作
  • ARM嵌入式学习--第十天(UART)
  • WebODM之python实现
  • 书生大模型实战营5
  • 在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入
  • Python GUI 开发 | PySide6 PyQt6 学习手册
  • C语言练习(31)
  • 9.进程间通信