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

 

目录
相关文章
|
20小时前
|
C++
C++一分钟之-虚函数与抽象类
【6月更文挑战第21天】在C++中,虚函数与抽象类是多态的基础,增进类间耦合与灵活性。虚函数实现动态绑定,抽象类定义不可实例化的接口。关键点包括:记得使用`virtual`,避免滥用虚函数,确保派生类实现纯虚函数。抽象类不能直接实例化,派生类必须实现所有纯虚函数。通过实例代码学习和实践,能更好地掌握这些概念以优化代码设计。
15 2
|
1天前
|
编译器 C++ Windows
C++ 链式继承下的虚函数列表
C++ 链式继承下的虚函数列表
|
2天前
|
C++ 容器
【C++】拷贝构造函数、拷贝赋值函数与析构函数
【C++】拷贝构造函数、拷贝赋值函数与析构函数
14 6
|
2天前
|
安全 C++ 开发者
C++一分钟之-函数参数传递:值传递与引用传递
【6月更文挑战第19天】C++中函数参数传递涉及值传递和引用传递。值传递传递实参副本,安全但可能效率低,适合不变对象;引用传递传递实参引用,允许修改,用于高效修改或返回多值。值传递示例显示交换不生效,而引用传递示例实现交换。常量引用则防止意外修改。选择传递方式需考虑效率与安全性。
18 2
|
8天前
|
C++ 容器
【C++语言】String 类关键函数实现,手搓一个简单字符串类!
【C++语言】String 类关键函数实现,手搓一个简单字符串类!
|
8天前
|
编译器 C++ 存储
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
|
8天前
|
编译器 C++
c++primer plus 6 读书笔记 第八章 函数探幽0
c++primer plus 6 读书笔记 第八章 函数探幽0
|
8天前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
10天前
|
C++
C++中函数模版与类模版
C++中函数模版与类模版
22 4
|
10天前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
20 2