C++ 类的继承与派生实例详解

C++ 类的继承与派生实例详解

一、什么是继承与派生

在面向对象的编程中,继承与派生是两个很重要的概念。通过继承,我们可以在已有的类的基础上,创建一个子类,并且让子类保留父类的功能和特征,然后在子类中再添加自己的功能和特征。这就是继承的意义所在。

派生是继承的一种实现方式。通过派生,子类可以从父类中继承所有的属性和方法,包括公有(public)、私有(private)和保护(protected)的成员。子类可以重载父类的成员函数,也可以添加自己独有的成员函数。

二、C++ 继承与派生详解

1. 基本语法

class ChildClass : access_specifier ParentClass {
    // add your children class member here
};
  • ChildClass指的是子类,即继承者
  • ParentClass指的是父类,即被继承者
  • access_specifier指明了子类可以访问父类的哪些成员,包括publicprotectedprivate三种类型

C++ 中常用的继承方式有三种:

  • public 继承
  • 子类继承了父类的公有和保护成员,但是不能访问父类的私有成员。
  • protected 继承
  • 子类继承了父类的保护成员,并将它们保护起来,即使是在子类中,也不能像父类那样直接访问它们。
  • private 继承
  • 子类继承了父类的私有成员,并将它们继承为私有成员。在子类中,仍然可以访问这些成员,但只能用基类的公有和保护成员来访问。

2. 继承链

假设我们有一个类 A 继承自另外一个类 B,现在又有一个类 C 继承自 A,那么我们就说 “A 是 C 的直接基类” 或 “C 是 A 的直接派生类”;同时,由于类 C 是类 A 的派生类,类 A 又是类 B 的基类,所以我们可以说 “C 是 B 的间接派生类”。这个继承关系形成了一个链条,叫做“继承链”。

3. 多重继承

C++ 还提供了一种更为灵活的继承方式——多重继承。多重继承是指一个类可以同时从多个基类中继承行为和属性。语法格式如下:

class ChildClass : access_specifier ParentClass1, access_specifier ParentClass2 {
    // add your children class member here
};

三、示例说明

1. 继承示例

#include <iostream>

class Animal {
public:
    std::string type;
    int age;
    void eat() {
        std::cout << "I'm eating!" << std::endl;
    }
};

class Dog : public Animal {
public:
    std::string name;
    void bark() {
        std::cout << "I'm barking!" << std::endl;
    }
};

int main() {
    Dog dog;
    dog.type = "dog";
    dog.age = 1;
    dog.name = "Tommy";
    std::cout << "This " << dog.type << " is " << dog.age << " years old." << std::endl;
    dog.bark();
    dog.eat();
    return 0;
} 

在上面的示例中,我们定义了一个 Animal 类,再从 Animal 类中派生出一个 Dog 类。在 Dog 类中,我们添加了独有的 name 成员和 bark() 成员函数,并继承了 Animal 类的 type 成员和 eat() 成员函数。

2. 多重继承示例

#include <iostream>

class Base1 {
public:
    void func1() {
        std::cout << "Base1->func1()" << std::endl;
    }
};

class Base2 {
public:
    void func1() {
        std::cout << "Base2->func1()" << std::endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    void func2() {
        std::cout << "Derived->func2()" << std::endl;
    }
};

int main() {
    Derived derived;
    derived.func1();  // 输出 Base1->func1()
    derived.Base2::func1();  // 输出 Base2->func1()
    derived.func2();  // 输出 Derived->func2()
    return 0;
}

在上面的示例中,我们定义了两个基类 Base1Base2,然后从这两个基类中派生出一个继承类 Derived。在 Derived 类中,我们添加了独有的成员函数 func2()

main() 函数中,我们首先创建了一个 Derived 类的对象 derived,然后调用了它所继承的类中的成员函数。由于 Derived 类同时继承自两个基类,因此当 Derived 类中的 func1() 函数被调用时,就会发生二义性问题。我们需要使用作用域解析运算符(::)来指明调用哪个基类中的成员函数。

综上,在 C++ 的类的继承与派生过程中,遵循基本语法和规范,可以通过继承和派生的方式实现代码的灵活性和高效性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 类的继承与派生实例详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Android使用Canvas绘制圆形进度条效果

    Android使用Canvas绘制圆形进度条效果 简介 在Android开发中,我们时常需要实现进度条效果。目前Android SDK中提供了ProgressBar和SeekBar两个基础进度条控件,但是它们的样式比较单一,难以满足特定的设计需求。因此,针对特定的UI设计需求,我们需要自定义进度条控件。其中,绘制圆形进度条是比较常用的一种方式。 本篇教程将基…

    other 2023年6月26日
    00
  • JS中构造函数的基本特性与优缺点

    JavaScript中的构造函数是用于创建对象的函数。在JavaScript中,你可以通过两种方式创建对象: 字面量创建对象,例如: let obj = { name: ‘John’, age: 25, greet() { console.log(`Hello, my name is ${this.name} and I am ${this.age} yea…

    other 2023年6月26日
    00
  • Java 1.0和Java 1.1 的IO类的比较

    Java 1.0和Java 1.1 的IO类是Java中最基本的操作之一,它包括输入和输出两个部分,其中输入InputStream和输出OutputStream是Java 1.0和Java 1.1的IO类最基础的部分。下面我们来一起详细讲解一下Java 1.0和Java 1.1 的IO类的比较。 Java 1.0的IO类 Java 1.0的IO类使用较为简单…

    other 2023年6月26日
    00
  • 详细解析let和const命令

    详细解析 let 和 const 命令 let 命令 let 命令用于声明一个块级作用域的变量。它与传统的 var 命令相比,具有更好的作用域控制和变量声明的语义。 语法 let variableName = initialValue; 示例说明 // 示例 1 let x = 10; if (true) { let x = 20; console.log(…

    other 2023年8月20日
    00
  • tree默认选中

    在Web应用程序中,我们经常需要使用树形结构来展示数据。在某些情况下,我们需要在树形结构中默认选中某些节点。以下是一个完整攻略,介绍了如何在树形结构中默认选中节点。 步骤1:树结构 首先,我们创建一个树形结构,该结构包含多个节点。以下是一个示例: <ul id="tree"> <li> <span>No…

    other 2023年5月6日
    00
  • 如何将C语言代码转换为应用程序(也就是编译)

    将C语言代码转换为应用程序的过程,是通过编译器将源代码翻译并转化为二进制文件的过程。 以下是将C语言代码转换为应用程序的完整攻略: 安装编译器:首先需要先安装C语言的编译器,常用的编译器有gcc、clang等。以gcc为例,在Linux系统下执行以下命令安装gcc: sudo apt-get install gcc 编写C语言代码:在电脑上编写C语言代码,需…

    other 2023年6月25日
    00
  • iOS中各种UI控件属性设置示例代码

    下面就是详细讲解“iOS中各种UI控件属性设置示例代码”的完整攻略。 1. UILabel 属性设置 1.1 设置字体大小和颜色 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; label.text = @"Hello World"; …

    other 2023年6月26日
    00
  • Android 中的类文件和类加载器详情

    当我们在开发 Android 应用程序的时候,会经常用到类(Class)以及类文件(Class File)。在 Android 开发中,类文件可以是一个 .java 文件编译后产生的 .class 文件,也可以是一个 .class 文件。同时,Android 中的类文件的加载也是通过类加载器(Class Loader)来完成的。下面,我们来详细讲解 Andr…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部