使用纯说明符覆盖虚函数是否有效?[复制]

Is it valid to override virtual function with pure specifier? [duplicate]

提问人:Yksisarvinen 提问时间:3/5/2020 最后编辑:Yksisarvinen 更新时间:3/5/2022 访问量:626

问:

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

我遇到了以下阶级等级:

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
}

此代码定义是否正确?我们是否可以用纯说明符覆盖定义?

C++ 重写 语言-律师 纯虚拟

评论

0赞 Martin Morterol 3/5/2020
也许,您可以添加标签 [language-lawyer],因为它是关于语言规范的?
0赞 Ivan 3/5/2020
我想如果它是抽象的,你就不能实例化。另一方面,我会说覆盖和覆盖函数不是一个好的做法,在这种情况下你会使用它?C
0赞 Yksisarvinen 3/5/2020
@MartinMorterol 添加,谢谢!
0赞 Yksisarvinen 3/5/2020
@Ivan恐怕它已经存在于我们的代码中,但不幸的是,它通过了我们的代码审查。我只是想知道这是否是可以做的事情(以及它实际上在做什么)。
2赞 Language Lawyer 3/6/2020
Dup of 我可以用纯虚函数覆盖虚函数吗?以及将非纯虚函数转换为子类中的纯函数等。

答:

18赞 Daniel Langr 3/5/2020 #1

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

[注意:抽象类可以从非抽象类派生而来,纯虚函数可以覆盖非纯虚函数。— 结束语]

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