2016-09-27 9 views
0

こんにちは私は自分の考えを持っていますが、実装方法はわかりません。私のプログラムでは、すでにBaseクラスと派生クラスはほとんどありません。クラス固有のパラメータを持つC++仮想メソッド

base.hpp 
BaseClass { 
public: 
    BaseClass(); 
    virtual int getSomething(int param); 
} 

base.cpp 
BaseClass::BaseClass(){}; 
int BaseClass::getSomething(int param) 
{ 
    return param * 5; 
} 

derived1.hpp 
DerivedClass1 : public BaseClass { 
public: 
    DerivedClass1(); 
} 

derived2.hpp 
DerivedClass2 : public BaseClass { 
public: 
    DerivedClass1(); 
} 

ここでは、必要に応じてDerivedクラスまたはBaseクラスを使用します。私が欲しいもの

BaseClass *c = (BaseClass *) new DerivedClass1; 
cout << c->getSomething(5); 

はDerivedClass1とDerivedClass2ごとに異なるだろう基底クラスで、クラスの特定のパラメータのいくつかのタイプを、持っていることです。ここに、どのように見えるかの例があります。 DerivedClass2 6または何であろうため

base.hpp 
BaseClass { 
public: 
    BaseClass(); 
    virtual int getSomething(int param); 
} 

base.cpp 
BaseClass::BaseClass(){}; 
int BaseClass::getSomething(int param) 
{ 
    return param * CLASS_SPECIFIC_PARAM; 
} 

次にDerivedClass1このCLASS_SPECIFIC_PARAMは、5あろう。 これも可能ですか?これを行う最善の方法は何ですか?

答えて

1

あなただけの子どもたちが自分の価値観にリセットされるあなたのベースクラスにパラメータを追加します。

base.hpp

BaseClass { 
public: 
    BaseClass() : m_param(0) {}; 
    virtual int getSomething(int param); 
protected: 
    int m_param; 
} 

derived1.hpp

DerivedClass1 : public BaseClass { 
public: 
    DerivedClass1() : m_param(5) {}; 
} 

derived2.hpp

DerivedClass2 : public BaseClass { 
public: 
    DerivedClass1() : m_param(6) {}; 
} 

PS:代わりに、保護されたメンバーの仮想(または純粋仮想関数)になり、あなたのBaseClass

+0

はい、これです。ありがとう – user2336793

1

への代替を仮想デストラクタを追加します。

BaseClass { 
public: 
    BaseClass(); 
    virtual int getSomething(int param); 
protected: 
    virtual int getClassSpecific() const =0; 
} 
//... 
BaseClass::BaseClass(){}; 
int BaseClass::getSomething(int param) 
{ 
    return param * getClassSpecific(); 
} 

//... 
DerivedClass1 : public BaseClass { 
//... 
virtual int getClassSpecific() const { return 5;} 
} 

//..... 
DerivedClass2 : public BaseClass { 
//... 
virtual int getClassSpecific() const { return 6;} 
} 
関連する問題