虚函数进阶

147 阅读2分钟

虚函数是什么

在 C++ 中,虚函数(Virtual Function)是一种用于实现多态性的机制。虚函数是在基类中定义的函数,可以在派生类中进行重写(Override),使得在通过基类指针或引用调用该函数时,实际调用的是派生类中的函数。

虚函数的定义方式是在函数声明前加上 virtual 关键字,例如:

class A {
public:
    virtual void foo();
};

在派生类中,如果想要重写基类中的虚函数,可以使用相同的函数原型和 override 关键字,例如:

class B : public A {
public:
    virtual void foo() override;
};

在上面的代码中,派生类 B 重写了基类 A 中的虚函数 foo()

虚函数的作用在于实现多态性,也称为动态多态性(Dynamic Polymorphism)。在通过基类指针或引用调用虚函数时,实际调用的是指向对象的实际类型中的函数。这种机制可以使得程序在不知道对象实际类型的情况下,仍然能够正确地调用相应的函数。

更复杂一点

#include <iostream>

class A {
public:
    virtual void draw() {
        std::cout << "Drawing shape A\n";
    }
    virtual void print() {
        std::cout << "This is A\n";
    }
};

class B : public A {
public:
    virtual void draw() override {
        std::cout << "Drawing shape B\n";
    }
    virtual void print() override {
        std::cout << "This is B\n";
    }
};

class C : public B {
public:
    virtual void draw() override {
        std::cout << "Drawing shape C\n";
    }
    virtual void print() override {
        std::cout << "This is C\n";
    }
};

int main() {
    C c;
    B* pb = &c;  // 指向 C 对象的 B 指针
    pb->draw();  // 动态绑定到 C::draw()
    pb->print(); // 动态绑定到 C::print()

    return 0;
}

main() 函数中,我们创建了一个 C 对象 c,然后将指向 C 对象的 B 指针 pb 初始化为 &c。接着,我们通过 pb->draw() 调用虚函数 draw(),由于指针 pb 指向的是 C 对象,因此会动态绑定到 C::draw(),打印出 "Drawing shape C\n"。接着,我们通过 pb->print() 调用虚函数 print(),同样会动态绑定到 C::print(),打印出 "This is C\n"。这就是动态绑定的机制,能够在运行时根据对象的实际类型,动态调用相应的虚函数。