C++零基础教程(类的继承)

简介: C++零基础教程(类的继承)

前言

本篇文章我们来讲解类的继承,继承在C++中是非常重要的概念,这里需要大家认真的学习一下。

一、类的组合关系

类的组合关系是一种在面向对象编程中常见的关系类型,它描述了一个类由其他类的对象作为成员来组成的情况。在组合关系中,一个类包含了其他类的对象作为自己的成员,这些成员对象的生命周期与包含它们的类对象的生命周期相关联。

组合关系通常用于表示"拥有"的关系,表示一个类作为另一个类的一部分存在。这种关系是一种强耦合的关系,所以在组合关系中,包含类的对象负责创建和销毁其成员对象。

下面我们以一个简单的代码示例来解释类的组合关系:

class Engine {
public:
    void start() {
        // 启动引擎的逻辑
    }
    void stop() {
        // 停止引擎的逻辑
    }
};
class Car {
private:
    Engine engine;
public:
    void startCar() {
        engine.start();
    }
    void stopCar() {
        engine.stop();
    }
};

在上述示例中,Engine 类表示一台发动机,它具有启动和停止的功能。Car 类表示一辆汽车,它使用了一个 Engine 对象作为其成员。这里 Car 类与 Engine 类之间存在组合关系,因为 Car 类拥有一个 Engine 对象作为其一部分。

通过组合关系,Car 类可以在自己的方法中调用 Engine 类的方法,实现了汽车的启动和停止操作。而 Engine 对象的生命周期与 Car 对象的生命周期相关联,当 Car 对象被创建时,Engine 对象也会被创建,并且当 Car 对象被销毁时,Engine 对象也会被销毁。

总结来说,类的组合关系描述了一个类通过将其他类的对象作为自己的成员来构成的关系,具有强耦合性,成员对象的生命周期与包含它们的类对象相关联。组合关系用于表示"拥有"的关系,允许包含类访问和操作成员对象的功能。

二、类的继承

在C++中,继承是一种面向对象编程的重要概念,它允许一个类(称为派生类)继承另一个类(称为基类或父类)的属性和方法。通过继承,派生类可以重用基类的代码,并且可以在不修改基类的情况下添加自己的特定功能。

C++中的继承分为几种类型:

1.公有继承(public inheritance):基类的公有成员在派生类中仍然是公有成员,基类的保护成员在派生类中变为保护成员,基类的私有成员在派生类中不可直接访问。公有继承使用关键字public来进行声明。

2.保护继承(protected inheritance):基类的公有和保护成员在派生类中变为保护成员,基类的私有成员在派生类中不可直接访问。保护继承使用关键字protected来进行声明。

3.私有继承(private inheritance):基类的所有成员在派生类中都变为私有成员,基类的成员在派生类中不可直接访问。私有继承使用关键字private来进行声明。

以下是一个简单的C++代码示例来解释继承的概念:

#include <iostream>
using namespace std;
class Animal {
protected:
    string name;
public:
    Animal(string name) {
        this->name = name;
    }
    void eat() {
        cout << name << " is eating." << endl;
    }
};
class Dog : public Animal {
public:
    Dog(string name) : Animal(name) {
    }
    void bark() {
        cout << name << " is barking." << endl;
    }
};
int main() {
    Dog dog("Buddy");
    dog.eat();    // 输出:Buddy is eating.
    dog.bark();   // 输出:Buddy is barking.
    return 0;
}

在上述示例中,Animal 类是基类,它有一个受保护的属性 name 表示动物的名字,以及一个公共方法 eat() 表示动物的进食行为。

Dog 类是派生类,通过关键字 public 继承了 Animal 类。子类可以继承基类的公有和保护成员,因此 Dog 类中可以访问和使用 name 属性和 eat() 方法。此外,Dog 类还新增了一个独有的方法 bark() 表示狗的叫声。

通过继承,我们在主函数中创建了一个 Dog 对象,并且可以调用其继承自基类的 eat() 方法和派生类新增的 bark() 方法。

继承的主要优势在于代码重用和扩展性。子类可以重用基类的代码,从而减少了重复编写相似功能的工作,并提高了代码的可维护性。同时,子类可以在继承的基础上添加、修改和重写基类的属性和方法,以满足特定的需求。

三、父类构造函数和子类构造函数的关系

创建子类对象时,首先会执行父类的构造函数,然后再执行子类的构造函数。这是因为子类继承了父类的成员,需要先初始化父类的成员,然后再初始化子类自己的成员。

class Base {
public:
    Base() {
        // Base类的构造函数实现
        cout << "Base类的构造函数被调用" << endl;
    }
};
class Derived : public Base {
public:
    Derived() {
        // Derived类的构造函数实现
        cout << "Derived类的构造函数被调用" << endl;
    }
};
int main() {
    Derived obj; // 创建Derived类的对象
    return 0;
}

输出结果将会是:

Base类的构造函数被调用
Derived类的构造函数被调用

从输出结果可以看出,创建Derived类的对象时,先调用了Base类的构造函数,然后才调用Derived类的构造函数。

四、父类析构函数和子类析构函数

在C++中,析构函数用于释放对象占用的资源,并在对象销毁时执行一些清理操作。当一个对象被销毁时,先调用子类的析构函数,然后再调用父类的析构函数。这是因为派生类继承了父类的成员,需要先释放派生类自己的资源,然后再释放父类的资源。

父类的析构函数通常被声明为虚函数,以便正确地销毁派生类对象。通过虚函数的多态性,当使用基类指针或引用指向派生类对象时,可以通过基类的指针或引用来销毁对象而调用相应的析构函数。

下面是一个简单的示例来说明父类析构函数和子类析构函数的调用顺序:

#include <iostream>
using namespace std;
class Base {
public:
    Base() {
        cout << "Base类的构造函数被调用" << endl;
    }
    virtual ~Base() {
        cout << "Base类的析构函数被调用" << endl;
    }
};
class Derived : public Base {
public:
    Derived() {
        cout << "Derived类的构造函数被调用" << endl;
    }
    ~Derived() override {
        cout << "Derived类的析构函数被调用" << endl;
    }
};
int main() {
    Derived obj; // 创建Derived类的对象
    return 0;
}

输出结果将会是:

Base类的构造函数被调用
Derived类的构造函数被调用
Derived类的析构函数被调用
Base类的析构函数被调用

从输出结果可以看出,当创建Derived类的对象时,先调用了Base类的构造函数,然后再调用了Derived类的构造函数。当销毁对象时,先调用了Derived类的析构函数,然后再调用了Base类的析构函数。这个顺序保证了销毁对象的正确性。

总结

本篇文章主要讲解到了继承,这个概念需要大家牢牢掌握,在继承中大家需要注意public ,protected,private这三个访问权限的不同区别。


相关文章
|
4月前
|
安全 Java 编译器
C++进阶(1)——继承
本文系统讲解C++继承机制,涵盖继承定义、访问限定符、派生类默认成员函数、菱形虚拟继承原理及组合与继承对比,深入剖析其在代码复用与面向对象设计中的应用。
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
10月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
419 12
|
8月前
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
183 0
|
8月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
226 0
|
8月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
357 0
|
11月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
215 16
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
11月前
|
IDE 编译器 项目管理
Dev-C++保姆级安装教程:Win10/Win11环境配置+避坑指南(附下载验证)
Dev-C++ 是一款专为 Windows 系统设计的轻量级 C/C++ 集成开发环境(IDE),内置 MinGW 编译器与调试器,支持代码高亮、项目管理等功能。4.9.9 版本作为经典稳定版,适合初学者和教学使用。本文详细介绍其安装流程、配置方法、功能验证及常见问题解决,同时提供进阶技巧和扩展学习资源,帮助用户快速上手并高效开发。
|
11月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。