在C++中使用虚拟关键字

ano*_*ous 13 c++ polymorphism virtual-functions

我知道C++实现了虚拟函数的运行时多态性,虚拟关键字是继承的,但我没有看到在派生类中使用虚拟关键字.

例如,在下面的情况下,即使你在派生类中删除虚拟关键字仍然ptr-> method()调用转到derived :: method.那么这个虚拟关键字在派生类中做了多少额外的事情?

#include<iostream>

using namespace std;

class base
{
public:
    virtual void method()
    {
        std::cout << std::endl << "BASE" << std::endl;
    }
};

class derived: public base
{
public:
    virtual void method()
    {
        std::cout << std::endl << "DERIVED" << std::endl;
    }
};

int main()
{
    base* ptr = new derived();
    ptr->method();
    return 9;
}
Run Code Online (Sandbox Code Playgroud)

小智 22

如果派生类的方法通过名称和签名匹配其中一个基类的虚方法,并且匹配的方法是虚拟的,那么派生类的方法也会变为虚拟.因此,从技术上讲,没有必要在派生类中标记"虚拟"这样的方法.然而,在C++ 11之前,它曾经是一个很好的实践,因为它是那些阅读代码的人的一个很好的暗示(很难记住基类的所有虚函数).

从C++ 11开始,在派生类中有两个额外的关键字可以帮助实现可读性和代码健壮性.他们是"覆盖"和"最终".例如,在派生类的方法中放置«override»可确保基类的相应方法实际上是虚拟的.«final»关键字执行相同的操作,它可以防止方法被进一步覆盖.

我也有更多真实世界的基本原理和代码示例,在我的博客写了一篇关于这一点,在这里.

希望能帮助到你.祝好运!


Nei*_*irk 8

没有.只是为了帮助提醒您哪些功能是虚拟的.


Nbr*_*r44 8

virtual仅在基类声明中是必需的.它在派生类中是可选的,并且在这些情况下可能主要用作提醒.

C++ 11引入override了更明确的东西:它明确地将派生类中的方法标记virtual为对基类方法的重写.