2016-12-26 5 views
0

これを行うにはC++で可能ですか?継承:基底クラスから派生クラス関数を呼び出す

class Base { 
    int a(Derived d) { d.b(); } 
}; 

class Derived : public Base { 
    int b(); 
}; 

Base.hppでもDerived.hppを含める必要がありますか?

+0

'b()'を 'Base'の純粋な仮想関数にしてください。 –

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+0

前方宣言と定義からの分割宣言を使用すると、サンプルが機能する場合があります。しかし、あなたが見せていることが本当にあなたが望むものなのかどうかはわかりません。 – Jarod42

答えて

1

これを行うにはC++が可能ですか?

はい、それはC++言語で使用される非常に簡単で、基本的なパターン(と呼ばれる多型またはTemplate Method Pattern)です:

class Base { 
    int a() { b(); } // Note there's no parameter needed! 
// Just provide a pure virtual function declaration in the base class 
protected:  
    virtual int b() = 0; 

}; 

class Derived : public Base { 
    int b(); 
}; 
+0

コンストラクタやデスクトーラでそのような関数を呼び出さないことを覚えておく必要があります。そうしないと、純粋な関数呼び出しで終わります。 – paweldac

+0

@paweldac幸いにもOPのサンプルではそうではありません。そうする必要がある場合は、その答えがその問題を修正します。 –

+0

は、提案されたコードを使用する可能性のある他の読者に明確にしたかっただけです。本当にOPの質問では、このエラーは出てこない:) – paweldac

0

次のコンパイル:

class Derived; 

class Base { 
public: 
    int a(Derived d); 
}; 

class Derived : public Base { 
public: 
    int b() { return 42; } 
}; 

int Base::a(Derived d) { d.b(); } 
+0

それはコンパイルされます。私はここで尋ねられていることではないことに気付いていますが(あなたがコメントで述べたように)。 –

0

これは、関数を呼び出すことが可能ですC++のイディオムと呼ばれる基底クラスのDerivedクラスから: "Curiously recurring template pattern" CRTP。以下の呼び出しを見つけてください:

template <class Child> 
struct Base 
{ 
    void foo() 
    { 
     static_cast<Child*>(this)->bar(); 
    } 
}; 

struct Derived : public Base<Derived> 
{ 
    void bar() 
    { 
     std::cout << "Bar" << std::endl; 
    } 
}; 
+0

これは別の方法です。そうです。 –

関連する問題