2017-07-11 103 views
0

我试图创建抽象基类BaseClass,它有一些字段(但不是全部),它们包含在派生类DerivedClass1DerivedClass2中。C++使用抽象基类方法创建派生类

BaseClass.h

class BaseClass 
{ 
private: 
    int bmember1; 
    int bmember2; 

public: 
    BaseClass(); 
    ~BaseClass(); 
}; 

例如,DerivedClass1不会有额外的会员...

DerivedClass1.h

class DerivedClass1 : public BaseClass 
{ 
public: 
    DerivedClass1(); 
    ~DerivedClass1(); 
}; 

..但是德rivedClass2会,dmember1dmember2

DerivedClass2.h

class DerivedClass2 : public BaseClass 
{ 
private: 
    int dmember1; 
    int dmember2; 

public: 
    DerivedClass1(); 
    ~DerivedClass1(); 
}; 

现在,我想在BaseClass一些方法,我可以构建任何派生类,动态的,使用的东西随心所欲,如枚举:

SwitchEnum.h

enum Switch_Enum 
{ 
    DERIVED_1, 
    DERIVED_2 
}; 

我想用参数来初始化BaseClass中的字段,但我也想给出一些默认值给那些只出现在派生类中的,我稍后可以用一个方法改变它BaseClass。所以,像

//(BaseClass.h) 

//BaseClass constructor, initializingthe BaseClass's fields with the parameters 
BaseClass(int param1, int param2) 
{ 
    //params to bmembers 
} 

//Construct the appropriate derived class 
static BaseClass* createBase(int param1, int param2, Switch_Enum selector); 
{ 
    switch(selector): 
    { 
    //DerivedClass1 if DERIVED_1, 2 if 2, etc. 
    //use BaseClass(int param1, int param2) to set the BaseClass fields that are present in all derived classes 
    //If derived class has additional fields, give default values to those as well 
    } 
} 

最后,设定可能的附加字段,这样做:

//(BaseClass.h) 
virtual void changeDmembers(int dmember2val, int dmember2val) 
{ 
    //if DerivedClass1, do nothing 
    //if DerivedClass2, set dmember1&2 to dmember1&2val 
} 

你是否认为这是在所有可行吗?我应该采取不同的方式吗?我是否应该在BaseClass中出现所有可能的字段,并且仅在派生类中使用它们(这对我来说看起来不太优雅)?

非常感谢您的提前!

+1

这是什么问题?请提供[MCVE](https://stackoverflow.com/help/mcve),以便我们能够为您提供帮助。 – Ron

+0

这是mtl; dr对不起 –

+0

基类不知道只存在于派生类中的成员。事实上,类别不知道其他类是否从它们派生出来。 –

回答

3

你是否认为这是在所有可行吗?

是的。

我应该接近这个不同?

十分肯定。使用您最喜爱的搜索引擎查找工厂模式。

我应该有所有可能的领域已经出现在BaseClass只有在派生类,将有它们(这似乎并没有太高雅了我)使用它们?

您的预感是正确的。这不是一个好主意。基类不应该对从它派生的类做任何假设。它应该具备它所需要的东西 - 无所不能,仅此而已。

+0

谢谢!我已经查看过工厂构造函数,但我无法弄清楚如何使用它们的参数。我只需要为抽象类编写一个参数化的构造函数,然后调用它呢?如果该功能是纯虚拟的,我甚至可以这么做吗? – SparksH

+0

有多种方法可以参数化工厂模式使用的构造函数。最通用的方法之一是传递'std :: map '。特定派生类型的构造函数将查找具有特定键的项目。如果找到它们,它可以从地图中提取数据,如果找不到,它可能会返回一个错误。 –