📜  C++ |虚函数|问题2(1)

📅  最后修改于: 2023-12-03 15:13:58.295000             🧑  作者: Mango

C++ | 虚函数 | 问题2

在 C++ 中,虚函数是一种特殊的成员函数,允许在派生类中通过基类指针或引用调用派生类的特定实现。通过使用虚函数,C++ 提供了一种实现运行时多态的机制,这对于实现面向对象的设计模式非常重要。

当基类中的函数被声明为虚函数时,任何派生类都可以针对该函数提供自己的实现。通过基类的指针或引用,可以根据运行时对象的实际类型来决定调用哪个实现。

声明虚函数

在基类中声明虚函数,需要在函数声明前加上关键字 virtual。例如:

class Base {
public:
    virtual void foo() {
        // 基类的实现
    }
};

在派生类中,可以选择覆盖(重写)虚函数。覆盖时使用 override 关键字可以增加代码的可读性,并帮助在编译时检测错误。

class Derived: public Base {
public:
    void foo() override {
        // 派生类的实现
    }
};
动态绑定和多态行为

通过使用虚函数,C++ 支持动态绑定,也被称为后期绑定或运行时绑定。这意味着在运行时,实际调用的函数取决于对象的实际类型。

Base* basePtr = new Derived();
basePtr->foo(); // 调用派生类的实现

这里 basePtr 是基类 Base 的指针,但指向的是派生类 Derived 的实例。因为 foo 函数是虚函数,所以会根据实际对象类型来选择调用的实现。

虚析构函数

如果类中含有虚函数,通常也需要将析构函数声明为虚函数。这样在删除一个指向派生类对象的基类指针,即使用 delete 操作符时,会正确调用适当的析构函数,而不是只调用基类的析构函数。

class Base {
public:
    virtual ~Base() {
        // 基类的析构函数
    }
};

class Derived: public Base {
public:
    ~Derived() override {
        // 派生类的析构函数
    }
};

Base* basePtr = new Derived();
delete basePtr; // 调用派生类的析构函数
注意事项
  • 虚函数会带来一定的运行时开销,因为需要在运行时进行函数调度。
  • 非虚函数的调用通常在编译时就可以确定,因此具有更好的性能。
  • 虚函数只能用于类的成员函数,而不能用于静态函数或全局函数。

通过合理地使用虚函数和多态机制,可以更好地组织和扩展代码,提高代码的可维护性和可复用性。

参考资料:C++ 虚函数 - Cplusplus.com