C++中的虚函数、纯虚函数与函数重写的技术性探讨

简介: C++中的虚函数、纯虚函数与函数重写的技术性探讨

一、引言

在C++面向对象编程中,虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)是两个核心概念,它们为实现多态性提供了基础。同时,函数重写(Function Overriding)是面向对象编程中子类对父类函数进行重新定义的一种技术。本文将详细探讨这些概念,包括它们的定义、用法以及在实际编程中的应用。

二、虚函数

定义

虚函数是在基类中声明并在一个或多个派生类中被重新定义的成员函数。在基类中使用virtual关键字进行声明,以表明该函数可以在派生类中被重写。

cpp

 

class Base {

 

public:

 

virtual void function() {

 

// 基类实现

 

std::cout << "Base function called." << std::endl;

 

}

 

};

 

 

 

class Derived : public Base {

 

public:

 

void function() override { // override是可选的,但建议使用以提供额外的清晰度

 

// 派生类实现

 

std::cout << "Derived function called." << std::endl;

 

}

 

};

用途

虚函数的主要用途是实现多态性。通过基类指针或引用指向派生类对象,并调用虚函数时,将执行与指针或引用所指向的对象类型相对应的派生类中的函数版本。这允许在运行时动态地确定要调用的函数版本。

cpp

 

Base* ptr = new Derived();

 

ptr->function(); // 输出 "Derived function called."

 

delete ptr;

三、纯虚函数

定义

纯虚函数是在基类中声明的虚函数,但它没有定义(只有声明)。在函数声明的结尾使用= 0来指示该函数是纯虚函数。包含纯虚函数的类被称为抽象类(Abstract Class),抽象类不能被实例化。

cpp

 

class AbstractBase {

 

public:

 

virtual void pureVirtualFunction() = 0; // 纯虚函数

 

};

 

 

 

class Derived : public AbstractBase {

 

public:

 

void pureVirtualFunction() override {

 

// 派生类实现

 

std::cout << "Derived pure virtual function called." << std::endl;

 

}

 

};

用途

纯虚函数用于定义接口,指定派生类必须实现的函数。通过继承抽象类并提供纯虚函数的实现,派生类可以创建具有特定行为的对象。这有助于实现代码重用和模块化设计。

四、函数重写

定义

函数重写(也称为函数覆盖)是指派生类中存在一个与基类虚函数同名、同参数列表、同返回类型的函数,并且该函数在派生类中使用override(可选)关键字进行声明。这样,当使用基类指针或引用指向派生类对象并调用该函数时,将执行派生类中的函数版本。

cpp

 

class Base {

 

public:

 

virtual void function() {

 

// ...

 

}

 

};

 

 

 

class Derived : public Base {

 

public:

 

void function() override { // 使用override关键字

 

// ...

 

}

 

};

注意事项

· 派生类重写的函数必须与基类中的虚函数具有相同的名称、参数列表和返回类型(协变返回类型除外)。

· 重写函数不能具有比基类函数更严格的访问控制(例如,基类函数为public,派生类函数不能为privateprotected)。

· 如果基类函数不是虚函数,派生类中的同名函数将隐藏基类函数,而不是重写它。这可能会导致意外的行为,因此应始终将打算被重写的函数声明为虚函数。

五、总结

虚函数、纯虚函数和函数重写是C++面向对象编程中的核心概念,它们为实现多态性和代码重用提供了强大的支持。通过正确地使用这些技术,我们可以创建灵活、可扩展和可维护的软件系统。在实际编程中,应根据具体需求选择是否使用虚函数和纯虚函数,并遵循函数重写的规则来确保代码的正确性和可读性。

 

目录
相关文章
|
1月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
48 4
|
1月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
32 3
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
5月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
93 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
4月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
163 6
|
4月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
62 0
|
4月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
46 3
|
4月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
45 3
|
4月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
709 1
|
4月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
67 1