2016-11-22 9 views
0

私はその属性の1つに応じて何かをする関数を提供するクラスを設計しようとしています。私は同じプロセスをやりたいのですが、別の値で、これが派生クラスを作成して属性を変更した理由です。C++ getterを使用しないでconstメンバーを継承する

まず、値は各オブジェクトに依存せずクラス自体に依存するため、私は静的属性を作成しました。あるいは、私は静的属性を継承して各クラスの属性を変更することはできません。

次に、継承を使用できるようにconstで自分の属性を配置することにしました。私はあなたに私の問題を示す簡単なプログラムを作った。ここでは、fooが親メソッドの値ではなくメソッドを呼び出すオブジェクトの値を表示するようにしたいと思います。また、私は自分のメソッドで何度も変数を使うことになるので、ゲッターを使いたくない。これは画像処理のためだ。

#include <iostream> 

// Compile it with 
// g++ -o child_test child_test.cpp -std=c++11 

class Parent{ 
    public: 
     Parent() {}  
     virtual void foo(){ 
      printf("%d\n", this->bar); 
     }  
    private:  
     const int bar = 0;  
};  

class Child : public Parent{  
    public: 
     Child() : Parent() {} 
    private: 
     const int bar = 10; 
}; 

int main(){  
    Parent * p = new Parent(); 
    p->foo(); // Output : 0 

    Child * c = new Child(); 
    c->foo(); // Output : 0 ? How could it be 10 

    Parent * cp; 
    cp = new Child(); 
    cp->foo(); // Output : 0 ? How could it be 10 
} 

答えて

4

これは言語の仕組みではありません。関数は仮想であるかもしれませんが、メンバ変数(定数)はそうではありません。

基本クラスに異なる値が必要な場合は、その値をコンストラクタに渡します。

class Parent{ 
    public: 
     Parent(int value = 0) : bar(value) {}  
     virtual void foo(){ 
      printf("%d\n", this->bar); 
     }  
    private:  
     const int bar = 0;  
};  

class Child : public Parent{  
    public: 
     Child() : Parent(10) {} 
}; 
+0

私はコンストラクタでインスタンス化する必要がありますか?それ以外の場合は、連絡が行われません。これは静的変数で可能ですか? –

0

C->のfoo(); //出力:0?どのようにそれはあなたが2つのメンバ変数barParentクラスの1、Childに1を持っている10

である可能性があります。出力が0

あなたオーバーライドする場合である理由です - それは、すでにbar変数を持っているParent実装を()を呼び出し、デフォルトでだからあなたfoo機能は、)ない仮想純粋であり、そしてそれは、Childクラスのをオーバーライドしていません(例えば、同じfoo機能付き)Childクラスのfoo関数は、出力が10

+0

はい、fooが大量の呼び出しを行う場合は、子のコードを書き直す必要がありますか?または、親メソッドへの呼び出しによって、子属性との連絡が行われますか? –

2

C->のfoo()です。 //出力:0?どうすればいいのですか?

アクセス方法を変更することができますbar。メンバー変数にする代わりに、値を返すメンバー関数virtualを使用します。

class Parent{ 
    public: 
     Parent() {}  
     virtual void foo(){ 
      printf("%d\n", this->bar()); 
     }  
    private:  
     virtual int bar() const 
     { 
      return 0; 
     } 
};  

class Child : public Parent{  
    public: 
     Child() : Parent() {} 
    private: 
     virtual int bar() const 
     { 
      return 10; 
     } 
}; 
+0

それ以上のメモリが必要ですか?私の実際のケースでは、私のattributeSは2D配列なので、getter noを使う必要がある場合はあまり最適化されませんでしたか? –

+0

@KevinM、それ以上のメモリを取っていません。実際、それは逆です。各オブジェクトは2つの 'int'をもう持ちません。それにかかわらず、あなたは直交トピックを提起しています。それがあなたの心配なら別の質問を投稿してください。 –

関連する問題