7

触れることができないいくつかの(レガシー)コードが宣言すると仮定しましょう

struct B{
 public:
  void f(){}
};

そして、持っているとしましょう

struct A{
 public:
  virtual void f()=0;
};

明示的に f() を呼び出さずに、つまり代わりに A サブクラス呼び出し B::f を作成することは可能ですか?

  struct C: public A, public B{
   void f(){
   B::f();
  }
 };

のようなものを持つ

 struct C:virtual public A,virtual public B{

 };

(コンパイラ A::f が定義されていないため、この最後のクラスは抽象であることに注意してください)

4

5 に答える 5

1

Aへのデリゲートの実装を作成しBます。

class A_Impl : public A
{
public:
    virtual void f()
    {
        b.f();
    }
private:
    B b;
}

Cから派生して実装しA_Implます。

class C: public A_Impl
{
};

または、継承階層のみを表示したい場合はA、からパブリックに派生しA、プライベートに派生しA_Implます。

class C: public A, private virtual A_Impl
{
};
于 2012-04-10T08:00:46.413 に答える
1

C++ では、B の関数と A の関数の暗黙の一致に基づいて多態的にディスパッチすることはできません。gccxml または他の同様の製品を使用してある種のコード生成に頼ることができますが、関数が 100 個しかない場合は、とにかくマクロを使用して転送をワンライナーに減らすことができます。これらを行います。

于 2012-04-10T06:57:04.723 に答える
0

いいえ、それはできません。そして、あなたが私たちに示したスニペットから、それは継承ではなく構成によってBメンバーでなければならないように見えます。Cいくつかの転送関数(またはそれらを自動的に生成するスクリプト)を作成する必要があります。

于 2012-04-10T06:27:19.557 に答える
0

次のようなことができます。

void C::f() {
    B* b = this;
    b->f();
}
于 2012-04-10T05:52:51.297 に答える
-1

したがって、A には 100 個の純粋仮想関数があり、B にはこれらの関数の実装があり、B を呼び出すためにこれらすべての関数を C に再実装することは避けたいと考えています。コンパイラに B の実装を自動的に使用させる方法はありません。コンパイラと戦うのではなく (毎回負けます!)、継承グラフを再考してください。おそらく、B を A のサブクラスにして、B から C を派生させます。または、B から 100 個のメソッドを因数分解して、A の具体的なサブクラスにします。

プログラミングは、ツールによって提供される制約内で問題を解決する技術です。ツールとの相性が悪い場合は、問題へのアプローチを再考するか、別のツールを使用する必要があります。

于 2012-04-10T08:25:35.463 に答える