C++学习之继承

简介: 通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。

继承是C++中面向对象编程的一个重要特性,它允许一个类(派生类)从另一个类(基类)继承属性和行为(即成员变量和成员函数)。通过继承,开发者可以重用已有代码,扩展类的功能,并实现多态性。本文将详细介绍C++中的继承,包括其基本概念、类型、实现方法和常见问题。

1. 继承的基本概念

在C++中,继承用于创建一个新类,使其拥有一个或多个已有类的属性和方法。基类提供了基本的接口和实现,而派生类则可以扩展或修改这些接口和实现。

示例

class Base {
public:
    void display() {
        std::cout << "Display Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() {
        std::cout << "Show Derived class" << std::endl;
    }
};
​

在上述例子中,Derived类继承了 Base类,并增加了一个新的方法 show

2. 继承的类型

C++支持三种类型的继承:公有继承、保护继承和私有继承。这三种继承方式决定了基类成员在派生类中的访问权限。

公有继承(public inheritance)

在公有继承中,基类的公有成员在派生类中保持公有,保护成员在派生类中保持保护,私有成员在派生类中不可访问。

class Base {
public:
    int publicVar;
protected:
    int protectedVar;
private:
    int privateVar;
};

class Derived : public Base {
    // publicVar 是 public
    // protectedVar 是 protected
    // privateVar 是不可访问的
};
​

保护继承(protected inheritance)

在保护继承中,基类的公有和保护成员在派生类中都变成保护成员。

class Derived : protected Base {
    // publicVar 是 protected
    // protectedVar 是 protected
    // privateVar 是不可访问的
};
​

私有继承(private inheritance)

在私有继承中,基类的公有和保护成员在派生类中都变成私有成员。

class Derived : private Base {
    // publicVar 是 private
    // protectedVar 是 private
    // privateVar 是不可访问的
};
​

3. 重写和重载

重写(Overriding)

重写是指在派生类中重新定义基类中的虚函数。通过重写,派生类可以提供特定的实现。重写必须使用 virtual关键字。

class Base {
public:
    virtual void display() {
        std::cout << "Display Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        std::cout << "Display Derived class" << std::endl;
    }
};
​

重载(Overloading)

重载是指在同一个作用域中定义多个函数,它们具有相同的名称但参数列表不同。重载不涉及继承,是在同一个类中实现的。

class Example {
public:
    void display() {
        std::cout << "Display no parameters" << std::endl;
    }

    void display(int i) {
        std::cout << "Display with int parameter: " << i << std::endl;
    }
};
​

4. 多重继承

C++允许一个派生类继承多个基类,这种方式称为多重继承。多重继承可以引入更复杂的关系,但也可能带来潜在的歧义和复杂性。

class Base1 {
public:
    void display() {
        std::cout << "Display Base1 class" << std::endl;
    }
};

class Base2 {
public:
    void show() {
        std::cout << "Show Base2 class" << std::endl;
    }
};

class Derived : public Base1, public Base2 {
    // Derived类同时继承Base1和Base2
};
​

菱形继承问题

菱形继承是多重继承中一个常见的问题,当一个类同时继承两个基类,而这两个基类又继承自同一个基类时,会出现菱形结构。

class Base {
public:
    int var;
};

class Derived1 : public Base {};
class Derived2 : public Base {};

class Derived3 : public Derived1, public Derived2 {
    // 继承链形成菱形结构
};
​

解决方法是使用虚继承(virtual inheritance),使得基类的实例在派生类中只保留一份。

class Base {
public:
    int var;
};

class Derived1 : virtual public Base {};
class Derived2 : virtual public Base {};

class Derived3 : public Derived1, public Derived2 {
    // 使用虚继承避免菱形继承问题
};
​

5. 抽象类和纯虚函数

抽象类是包含纯虚函数的类,不能实例化。纯虚函数是没有实现的函数,定义方式是在函数声明后加 = 0

class AbstractBase {
public:
    virtual void display() = 0; // 纯虚函数
};

class ConcreteDerived : public AbstractBase {
public:
    void display() override {
        std::cout << "Concrete implementation" << std::endl;
    }
};
​

分析说明表

概念 描述
基类 提供基本接口和实现的类
派生类 继承自基类并扩展或修改其功能的类
公有继承 基类的公有和保护成员在派生类中分别保持公有和保护访问级别
保护继承 基类的公有和保护成员在派生类中都变成保护访问级别
私有继承 基类的公有和保护成员在派生类中都变成私有访问级别
重写 在派生类中重新定义基类的虚函数
重载 在同一个类中定义多个同名函数,但参数列表不同
多重继承 一个派生类继承多个基类
菱形继承 多重继承中一个类继承两个基类,而这两个基类又继承自同一个基类
抽象类 包含纯虚函数的类,不能实例化
纯虚函数 没有实现的函数,必须在派生类中实现

思维导图

C++继承
|
|-- 基本概念
|   |-- 基类和派生类
|
|-- 继承类型
|   |-- 公有继承
|   |-- 保护继承
|   |-- 私有继承
|
|-- 重写和重载
|   |-- 重写
|   |-- 重载
|
|-- 多重继承
|   |-- 多重继承概念
|   |-- 菱形继承问题
|       |-- 虚继承解决
|
|-- 抽象类和纯虚函数
|   |-- 抽象类
|   |-- 纯虚函数
​

结论

通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。

目录
相关文章
|
20天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
44 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
37 1
【C++】继承
|
5月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
94 0
|
3月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
3月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
97 11
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
68 1
|
3月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
53 1
|
3月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
32 1
|
3月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
24 0
|
3月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
44 0