0

オーバーライドではなく、仮想メソッドを非表示にしたいと考えています。歴史的/互換性の理由から、オーバーライド指定子はオプションであり、オーバーライドは暗黙的に行われることを知っています。上書きをやめるために、私は通常、デフォルトの「ダミー」パラメーターを追加して署名を調整しました。より良い方法はありますか?

次のコードを想定します。

#include <iostream>

class A{
public:
    virtual void Foo()
    {
        std::cout << "A::Foo";
    }
};

class B : public A
{
public:
    void Foo() /*not override, just hide*/
    {
        std::cout << "B::Foo";
    }
};

int main()
{
    B b{};
    A& a = b;
    a.Foo(); //should print A::Foo - but prints B::Foo
}

これまでに行ったことは次のとおりです。

#include <iostream>

class A{
public:
    virtual void Foo()
    {
        std::cout << "A::Foo";
    }
};

template<typename T>
class reintroduce{};

class B : public A
{
public:
    void Foo(reintroduce<B> = {}) /*not override, just hide*/
    {
        std::cout << "B::Foo";
    }
};

int main()
{
    B b{};
    A& a = b;
    a.Foo(); //should print A::Foo
}
4

1 に答える 1