为什么此方法在未标记为虚拟时表现为虚拟?

时间:2014-03-28 04:19:24

标签: c++ polymorphism

假设我有以下代码

class base
{
    public:
    virtual void MyVirtual() { std::cout << "This is base MyVirtual \n";}
    void NonVirtual()        { std::cout << "This is base NonVirtual \n";}
};

class derA : public base
{
    public:
    void MyVirtual()  { std::cout << "This is derA MyVirtual \n";}
    void NonVirtual() { std::cout << "This is derA NonVirtual \n";}
};


class derB : public derA
{
    public:
    void MyVirtual()  { std::cout << "This is derB MyVirtual \n";}
    void NonVirtual() { std::cout << "This is derB NonVirtual \n";}
};

int main()
{
    derA *da = new derB;
    da->MyVirtual();     // "This is derB MyVirtual \n"
    da->NonVirtual();
    std::cin.get();
    return 0;
}

现在我的问题是为什么MyVirtual Method在类derA中没有标记为虚拟时表现为虚拟?

2 个答案:

答案 0 :(得分:3)

在C ++中,即使没有virtual关键字,继承的虚函数仍然在派生类中保持虚拟。为每个继承的函数编写virtual被认为是一种好习惯。

<强>更新

正如C ++ 11中的评论所指出的那样,在声明者之后立即包含关键字override被认为是一种好习惯。这会捕获一类常见的错误,并在代码中明确表达意图。

答案 1 :(得分:3)

根据标准§10.3第2点

  

如果在类Base和a中声明了虚拟成员函数vf   class派生,直接或间接来自Base,一个成员   函数vf,同名,参数类型列表,   与Base :: vf相关的cv-qualification和refqualifier(或不存在)   声明,然后Derived :: vf也是虚拟的(无论是否是这样   声明)并覆盖Base :: vf。

直接从标准中得到答案。因此,如果您在派生类中使用了关键字virtual,则无关紧要。