それは、純粋指定子で仮想関数をオーバーライドするために有効ですか?

ユニコーン:

注:私はこれを行うには合理的なものであるかどうかを尋ねていないか、これは良いデザインですか。これは、明確に定義された行動であれば期待通りの結果がある場合、私はただ聞いていますのよ。

私は、次のクラス階層に出くわしました:

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
}

このコードは、明確に定義されていますか?私たちは純粋指定子と定義をオーバーライドすることができていますか?

ダニエルLangr:

[class.abstract / 5]現在のドラフト標準の:

[ 注:抽象クラスは、抽象的ではないクラスから派生することができ、純粋仮想関数は、純粋でない仮想関数をオーバーライドすることができます- エンドノート ]

非常に同じノートはさえに含まれているC ++ 11標準だから、答えはイエス、それが有効です

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=30151&siteId=1