4

私が次のようなクラスAとBを持っていると考えてください

class A
{
   public:
   void Fun();
};

class B  : public A
{
   ....
};

クラスAの設計者として、派生クラスBおよびAから派生する他のクラスが非仮想関数Fun()を非表示にするのを防ぐ(何らかのエラーが発生する)ように強制できる方法はありますか?

4

1 に答える 1

3

virtualメンバー関数に常に何らかの方法でアクセスできるようにする場合は、名前空間スコープのない関数でラップするだけです。

namespace revealed {
    void foo( A& o ) { o.foo(); }
}

これで、クラスBのクライアントはいつでも実行できます

void bar()
{
    B o;
    revealed::foo( o );
}

ただし、クラスBがオーバーロードの非表示をいくら導入しても、クライアントは

void bar2()
{
    B o;
    A& ah = o;
    ah.foo();
}

そして彼らはすることができます

void bar3()
{
    B o;
    o.A::foo();
}

したがって、得られるのは、わかりやすい表記法と意図的なコミュニケーションだけです。

つまり、不可能とはほど遠い、コメントにあるように、可用性はデフォルトで持っているものです…

于 2013-02-21T08:15:43.487 に答える