私が次のようなクラスAとBを持っていると考えてください
class A
{
public:
void Fun();
};
class B : public A
{
....
};
クラスAの設計者として、派生クラスBおよびAから派生する他のクラスが非仮想関数Fun()を非表示にするのを防ぐ(何らかのエラーが発生する)ように強制できる方法はありますか?
私が次のようなクラスAとBを持っていると考えてください
class A
{
public:
void Fun();
};
class B : public A
{
....
};
クラスAの設計者として、派生クラスBおよびAから派生する他のクラスが非仮想関数Fun()を非表示にするのを防ぐ(何らかのエラーが発生する)ように強制できる方法はありますか?
非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();
}
したがって、得られるのは、わかりやすい表記法と意図的なコミュニケーションだけです。
つまり、不可能とはほど遠い、コメントにあるように、可用性はデフォルトで持っているものです…