【问题标题】:Is it valid to override virtual function with pure specifier? [duplicate]用纯说明符覆盖虚函数是否有效? [复制]
【发布时间】:2020-06-17 23:26:46
【问题描述】:

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

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

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
}

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

【问题讨论】:

  • 也许,您可以添加标签 [language-lawyer],因为它是关于语言规范的?
  • 我猜你不能实例化 C 如果它是抽象的。另一方面,我会说覆盖和覆盖函数不是一个好习惯,在这种情况下你会使用它吗?
  • @MartinMorterol 已添加,谢谢!
  • @Ivan 恐怕它已经存在于我们的代码中,不幸的是它通过了我们的代码审查。我只是想知道这是否可以做(以及它实际上在做什么)。

标签: c++ overriding language-lawyer pure-virtual


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2022-01-13
    • 2021-09-30
    • 2020-08-21
    • 2021-08-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多