2011-07-04 26 views
2

C++の継承を正しく理解しようとしています。C++の単純継承問題

まず、自分自身のインスタンス化を返すクラスを用意してもよろしいですか?

class Class1 { 
public: 
    Class1 foo(); 
} 

基本的には、方程式を取得して式を返すような式を導き出すクラスがあります。

また、私は自分自身のインスタンスを返すのClass1のいくつかのサブクラスたい場合:

class Child : public Class1 { 
public: 
    Child bar(); 
} 

を、私はクラス1の機能の一部を使用していたが、代わりにクラス1のを返すので、私は子オブジェクトを返すようにしたいでしょう、これは継承で可能でしょうか?

ありがとうございます、うまくいけば、この質問はあまりにもダムではありません。

+0

あなたが何をしたいのかを示すより完全な例を作成してください。 –

+0

あなたはそれを試してみませんか?あなたの選択したコンパイラにコードを接続して実験してみてください。 – Vinnyq12

+0

こんにちは、私は最初のビット(自分自身のインスタンス化を返すクラス)を試してみましたが、それは問題ありませんが、それが良い/悪い練習であるかどうか疑問に思っていますか? 2番目ですが、どうやってやっているのか分かりません。私はまだそれをやっています。 – ale

答えて

1

はい、

あなたがFactoryとして、最新デザイン・パターンの用語で知られている明確に定義された問題を、説明されているように私には見えます。

は、次のことを考えてみましょう:

class Class1 { 
public: 
    static Class1 * getInstance(Equation * eq); 

    virtual void foo() = 0; 
} 

class Child : public Class1 { 
public: 
    virtual void foo(); 
} 

class OtherChild : public Class1 { 
public: 
    virtual void foo(); 
} 

あなたは、両方の子供たちのために、異なるのfoo()メソッドを実装します。

だから、例えば、あなたは可能性:

int main(){ 

    Equation myEquation("x=y/4"); 

    Class1 * myInstance = Class1::getInstance (&myEquation); 

    myInstance->foo(); //would call the virtual method of the child class. You don't care what subclass, this was figured out by the "getInstance" method. 

} 
1

書かれたとして、そこに問題ありませんが、どのようにそれを使用するつもりです。値によって返される はコピーを伴い、コピーと多型は一般的には一緒に には行きません。通常(ただし例外があります)、 は新しく割り当てられたインスタンスへのポインタを返すことが望ましいです。 ( のメモリ管理の問題に対処する必要があります。 クラスの論理的な意味でサイクルが不可能な場合は、 std::shared_ptrを使用できます。それ以外の場合は別の処理を行う必要があります)。

0

まず、 がインスタンス化を返すクラスを持つことはできますか?

はい、問題はありません。あなたの場合はきれいなデザインのようです。あなたが提案したデザインを持つことができます。あるいは、あなたのクラスが異なるオブジェクトを返す異なるデザインを持つことができます。 class DerivedEquation、またはclass Deriverがあり、これにはEquationがあり、Equationが返されます。これらのデザインはすべて問題ありません。私はClass1のも自分自身を のインスタンスを返す のいくつかのサブクラスを望んでいたと私はクラス1のを返す のいくつかのクラス1の機能が、代わりに を使用したい場合は

、私は、 リターン子オブジェクトになりたいと思いますこれは継承が可能な ですか?

これも問題ありません。あなたが提案したのとまったく同じようにClass1::foo()Child::bar()を持つことができます。また、2つの異なる関数名を使用したくない場合は、fooの定義をClass1 * foo()またはClass1 & foo()に変更すると、Childにオーバーロードすることができます。