用纯说明符覆盖虚函数是否有效?

Yks*_*nen 18 c++ overriding pure-virtual language-lawyer

注意:我不问这样做是否合理,或者这是否是好的设计。我只是问这是否是明确定义的行为,以及结果是否符合预期。

我遇到了以下类层次结构:

struct A
{
    virtual void foo() = 0;
};

struct B: public A
{
    void foo() override 
    {
        std::cout << "B::foo()\n";
    }
};

struct C: public B
{
    virtual void foo() = 0;
};

struct D: public C
{
    void foo() override
    {
        std::cout << "D::foo()\n";
    }
};

int main()
{
    A* d = new D;
    d->foo(); //outputs "D::foo()"
    // A* c = new C; // doesn't compile as expected
}
Run Code Online (Sandbox Code Playgroud)

这段代码定义得好吗?我们是否允许使用纯说明符覆盖定义?

Dan*_*ica 17

当前标准草案的[class.abstract/5]

[注意:抽象类可以从非抽象类派生,纯虚函数可以覆盖非纯虚函数。—尾注]

即使在C++11 标准中也包含相同的注释。所以,答案是肯定的,它是有效的