目录
概念
虚函数是一种具有特殊属性的成员函数,它可以被子类重写,并在运行时确定调用哪个方法。为了定义一个虚函数,将在该函数的声明中使用关键字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++ 虚函数内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站! |