複数の継承で、基本クラスの仮想関数の1つが単一の仮想定義になることを指定する方法があるかどうかを知りたい。私がこれを行う方法は、派生クラスにこの関数の明示的な定義を記述し、明示的に基本クラスの1つを呼び出すことです。これは厄介で、私はusing
が助けてくれることを願っていましたが、そうではありません。多重継承は、それを再分割せずに所望の仮想関数を指定する
例えば、私はちょうどクラスBのバージョンに転送したいのに、私はC::value
を定義する必要があります。もっと簡単な方法はありませんか?
#include <iostream>
using namespace std;
struct A
{
virtual char const * value() const
{ return "A"; }
};
struct B
{
virtual char const * value() const
{ return "B"; }
};
class C : public A, public B
{
public:
//using B::value;
virtual char const * value() const
{ return B::value(); }
};
int main()
{
C obj;
cout << obj.value() << endl;
A * ptr = &obj;
cout << ptr->value() << endl;
}
いくつかの注意:クラスAのこの特定のケース仮想継承で
- は、クラスBのためのオプションではありません - 私は理論的構造体でベース
- まで適切な建設チェーンを必要としますBはAとは無関係に使用することもできますが、他のオプションを提供する場合はそうではありません。
value
は何らかの理由で役立つ場合は純粋仮想としてマークされていますが、それは信じられません。
私は疑う「B」になる必要がありますAから派生したが
上記のプログラムの出力は何ですか? – Bingo
継承ツリーにダミーの「ノード」を追加することもできます(例えば、「A」から仮想的に継承する「DummyC」、「DummyC」および「B」から継承する「C」)。それが可能かどうかはわかりませんが、こちらをご覧ください:http://stackoverflow.com/questions/3310910/method-resolution-order-in-cこれが役立つかどうかを確認してください。 – Asaf
@Bingo、私は関数をオーバーライドするので、上記のプログラムは "B"と "B"を出力します。あなたがこれをしないならば、単に 'using'宣言をして" B "と" A "を得るでしょう。 –