一文带你学习C++中的虚函数

 

概念

虚函数是一种具有特殊属性的成员函数,它可以被子类重写,并在运行时确定调用哪个方法。为了定义一个虚函数,将在该函数的声明中使用关键字virtual。当调用一个虚函数时,编译器不会立即解析函数的调用,而是使用一个虚函数表(VTable)来查找到实际方法的地址。

 

语法

//在基类声明中定义虚函数: class Base { public: virtual void DoSomething(); };

//在子类声明中覆盖虚函数: class Derived : public Base { public: void DoSomething() override; };

在基类中定义一个虚函数时,必须在函数声明中使用 virtual 关键字。如果您想其在子类中被继承,则需要在访问说明符后使用该关键字。在子类中覆盖虚函数时,需要使用 override 关键字,以帮助编译器查找组合关系中的错误。

 

使用

虚函数在继承关系中非常有用。例如,如果您有一个 Base 类,其中包含一个名为 DoSomething 的虚函数,您希望在 Derived 类中更改 DoSomething 方法的实现,则可以将其覆盖为 Derived 的特定实现。当您调用实际的 DoSomething 方法时,虚函数表将用于查找 Derived 方法的地址,而不是 Base 方法。

示例1:调用虚函数

下面是一个简单的示例,展示如何从基类和派生类中调用虚函数。请注意,在这里代码中,pBase 指向 Derived 类的实例,但是调用的是 Derived 的虚函数,而不是 Base 的实际函数。

#include

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

class Derived : public Base { public: void DoSomething() override { std::cout << "Derived DoSomething() called" << std::endl; } };

int main() { Derived derived; Base* pBase = &derived;

pBase->DoSomething(); // 调用 Derived::DoSomething() }

输出:

Derived DoSomething() called

示例2:使用虚函数进行动态绑定

下面是一个更高级的示例,演示如何使用虚函数进行动态绑定。假设有一个 Shape 的基类,包含一个名为 Draw 的虚方法,并且有两个派生类: Circle 和 Square。如下图所示:

我们可以定义一个名为 draw_all 的方法,该方法将为每个形状调用 Draw 方法。在这种情况下,我们将使用循环遍历形状的列表,并根据基类指针调用 Draw 方法。但是,由于 Draw 是虚的,所以它将总是委托给子类调用。

#include #include

class Shape { public: virtual void Draw() { std::cout << "Base shape drawing" << std::endl; } };

class Circle : public Shape { public: void Draw() override { std::cout << "Circle drawing" << std::endl; } };

class Square : public Shape { public: void Draw() override { std::cout << "Square drawing" << std::endl; } };

void draw_all(const std::vector<Shape*>& shapes) { for (const auto& shape : shapes) { shape->Draw(); } }

int main() { std::vector<Shape*> shapes = {new Circle(), new Square(), new Circle(), new Square()}; draw_all(shapes); }

输出:

Circle drawing Square drawing Circle drawing Square drawing

 

总结

这篇文章介绍了C++虚函数的基本概念、语法、使用及其示例。虚函数是面向对象编程中非常重要的概念,常用于继承关系中,允许子类重写基类方法,以实现更多的灵活性和可复用性。通过使用虚函数表,C++可以确保在必要的时候调用正确的方法,从而提高程序的整体性能。

关于一文详解C++虚函数的文章就介绍至此,更多相关C++虚函数内容请搜索编程宝库以前的文章,希望以后支持编程宝库

 思维导图 准备工作对控制参数的处理一共有 7 个可选参数,分别是-a、-l、-R、-t、-r、-i、-s,这些参数可以相互自由组合,因此可以设计一种机制,就是直接把它们全部用循环一次性 ...