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

C++ 中的继承与派生

在 C++ 中,继承与派生是面向对象编程的重要特性,它们允许创建新类(派生类)来复用现有类(基类)的属性和方法,同时还能添加新的功能或修改现有功能,下面为你详细介绍。

基本概念

  • 继承:是指一个新类(派生类)可以从一个或多个已有类(基类)中获取其属性和方法的机制。通过继承,派生类可以复用基类的代码,提高代码的可重用性和可维护性。
  • 派生:是指从一个已有的类创建新类的过程。派生类除了拥有基类的成员外,还可以添加自己的成员,从而扩展基类的功能。

语法

定义派生类的一般语法如下:

class 派生类名 : 继承方式 基类名 {
    // 派生类的成员声明
};
  • 派生类名:新创建的类的名称。
  • 继承方式:指定派生类如何继承基类的成员,有三种继承方式:public(公有继承)、protected(保护继承)和 private(私有继承)。
  • 基类名:已有的类的名称。

继承方式

1. 公有继承(public
  • 基类的公有成员在派生类中仍然是公有的。
  • 基类的保护成员在派生类中仍然是保护的。
  • 基类的私有成员在派生类中不可直接访问。
#include <iostream>

// 基类
class Base {
public:
    void publicFunc() {
        std::cout << "Base public function" << std::endl;
    }
protected:
    void protectedFunc() {
        std::cout << "Base protected function" << std::endl;
    }
private:
    void privateFunc() {
        std::cout << "Base private function" << std::endl;
    }
};

// 派生类,公有继承
class Derived : public Base {
public:
    void test() {
        publicFunc(); // 可以访问
        protectedFunc(); // 可以访问
        // privateFunc(); // 不能访问
    }
};

int main() {
    Derived d;
    d.publicFunc(); // 可以访问
    // d.protectedFunc(); // 不能在类外访问
    d.test();
    return 0;
}
2. 保护继承(protected
  • 基类的公有成员和保护成员在派生类中都变为保护的。
  • 基类的私有成员在派生类中不可直接访问。
3. 私有继承(private
  • 基类的公有成员和保护成员在派生类中都变为私有的。
  • 基类的私有成员在派生类中不可直接访问。

派生类的构造函数和析构函数

  • 构造函数:派生类的构造函数在创建对象时会先调用基类的构造函数,然后再执行自身的构造函数体。如果基类有带参数的构造函数,派生类需要在其构造函数的初始化列表中显式调用基类的构造函数。
  • 析构函数:派生类的析构函数在对象销毁时会先执行自身的析构函数体,然后再调用基类的析构函数。
#include <iostream>

// 基类
class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }
    ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor" << std::endl;
    }
    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    Derived d;
    return 0;
}

派生类对基类成员的访问和覆盖

  • 访问:派生类可以直接访问基类的公有和保护成员,但不能直接访问基类的私有成员。
  • 覆盖:派生类可以定义与基类同名的成员函数,从而覆盖基类的成员函数。当通过派生类对象调用该函数时,将调用派生类中定义的函数。
#include <iostream>

// 基类
class Base {
public:
    void func() {
        std::cout << "Base func" << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void func() {
        std::cout << "Derived func" << std::endl;
    }
};

int main() {
    Derived d;
    d.func(); // 调用派生类的 func 函数
    d.Base::func(); // 调用基类的 func 函数
    return 0;
}

多重继承

C++ 支持多重继承,即一个派生类可以从多个基类继承属性和方法。多重继承的语法如下:

class 派生类名 : 继承方式 基类名1, 继承方式 基类名2, ... {
    // 派生类的成员声明
};

多重继承虽然可以增加代码的复用性,但也会带来一些问题,如命名冲突和菱形继承问题,需要使用作用域解析运算符或虚拟继承来解决。

相关文章:

  • Windchill 成套的解决方案
  • Linux Mem -- ARM8.5-A Memory Tagging Extension
  • 人工智能大模型技术剖析:分类、对比与性能洞察
  • 【情感识别】SECap: Speech Emotion Captioning with Large Language Model 论文阅读
  • 逻辑回归不能解决非线性问题,而svm可以解决
  • 【prompt实战】旅行攻略顾问
  • 二、k8s项目的生命周期
  • 闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体
  • hot100_101. 对称二叉树
  • 国家队出手!DeepSeek上线国家超算互联网平台!
  • 使用docker compose启动postgres并设置时区
  • 力扣100. 相同的树(利用分解思想解决)
  • 相机与激光雷达联合标定综述
  • 网络安全 | 什么是网络安全?
  • Vue2/Vue3生命周期对比
  • 第十五天 学习并实践HarmonyOS应用的基本结构、页面导航和状态管理
  • C++:构造函数,static成员,友元,内部类
  • 指标+大模型,构建更全、更准、更快的数据分析体验
  • Vue 2 + Webpack 项目中集成 ESLint 和 Prettier
  • 深入浅出理解HBase:大数据时代的“超级仓库”
  • 多家中小银行存款利率迈入“1时代”
  • 江西省市场监管局原局长谢来发被双开:违规接受旅游活动安排
  • 商务部新闻发言人就中美日内瓦经贸会谈联合声明发表谈话
  • 来伊份:已下架涉事批次蜜枣粽产品,消费者可获额外补偿,取得实物后进一步分析
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10千米
  • “犍陀罗艺术与亚洲文明”在浙大对外展出