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

问题描述 投票:4回答:1

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

我遇到了下面的类层次结构:

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
}

此代码定义是否正确?我们是否可以使用pure-specifier覆盖定义?


编辑:我不确定C是否实际上是覆盖。该假设可能是错误的。

struct E: public C
{
    using B::foo;
};

//E is still abstract
c++ overriding language-lawyer pure-virtual
1个回答
2
投票

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

[注:抽象类可以从非抽象的类派生,并且一个纯虚函数可能会覆盖一个非纯虚函数。 — 尾注]

© www.soinside.com 2019 - 2024. All rights reserved.