Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基类派生多个类的设计困境_C++_Oop_Inheritance - Fatal编程技术网

C++ 从基类派生多个类的设计困境

C++ 从基类派生多个类的设计困境,c++,oop,inheritance,C++,Oop,Inheritance,我正在做一个项目,需要一些简单的建议 我有一个基类,以及从该基类派生的6个类 这6个派生类中的5个应该有两个私有int,但第6个只需要一个私有int。当然,成员函数get和set用于两个int,第6个get和set用于一个int 我的问题是:我应该有一个包含两个int和set-and-get函数的基类,还是应该有一个包含一个int和set-and-get函数的基类,以及所有其他派生类,第六个派生类除外,还有一个int和两个方法 类中当然不应该有多余的方法。我建议创建第7类,作为其他5类的基础:

我正在做一个项目,需要一些简单的建议

我有一个基类,以及从该基类派生的6个类

这6个派生类中的5个应该有两个私有int,但第6个只需要一个私有int。当然,成员函数get和set用于两个int,第6个get和set用于一个int


我的问题是:我应该有一个包含两个int和set-and-get函数的基类,还是应该有一个包含一个int和set-and-get函数的基类,以及所有其他派生类,第六个派生类除外,还有一个int和两个方法

类中当然不应该有多余的方法。我建议创建第7类,作为其他5类的基础:

class BaseLevelOne { protected: int X; };
class BaseLevelTwo : public BaseLevelOne { protected: int Y; };

class One : public BaseLevelOne { /* get & set */ };
class Two /* Three, Four, etc. */ : public BaseLevelTwo { };
这样你就:

不必写第二个int五次 一班不必有多余的成员
但是,如果您确实说明了希望对这些类执行什么操作,那么我的回答可能会更精确,更适合实际用例。

您的问题的答案取决于不同的类模型是什么以及int数据成员的含义。让我们假设您的派生类应该真正从基类继承,这是一个很大的假设。我还假设我们在这里讨论的是公共继承

当然,基类不能同时包含两个int数据成员。如果层次结构正确,则第二个成员仅对该类的某些对象有意义,特别是对第六个类的对象没有意义。请记住,公共继承模型是一种IS-A关系:基类的所有部分也必须应用于所有派生类

现在是第一个数据成员。它在所有派生类中都是相同的吗?对于您可以想象得到的任何其他派生类,它是否也意味着相同?基类的所有对象都应该有这个成员吗?如果是这样,它应该出现在基类中

这里最重要的是拥有一个具有正确继承的良好设计。如果你有,那么你的问题的答案是微不足道的。如果你没有,答案是无关紧要的,因为你必须先修复你的设计

我的问题是:我应该有一个包含两个int和set-and-get函数的基类,还是应该有一个包含一个int和set-and-get函数的基类,以及所有其他派生类,第六个派生类除外,还有一个int和两个方法

假设公共继承,这完全取决于您的设计需求。扪心自问:我是否需要通过基类引用访问第二个int?如果答案是肯定的,那么它需要在基类中。如果答案是否定的,那么它就不应该在那个基类中

我理解多次不实现其他数据的动机,但这是一个实现工件,应该在实现中解决,您可以私下从实现该数据的另一个库继承,而不是在您的设计中


也就是说,请注意,如果你需要设置器和获取器,。

@rhalbersma:你的意思是……和公共数据一样糟糕,雪莉?@LuchianGrigore呃,是的,弗洛伊德的说法:受保护的数据和公共数据一样糟糕。你提出的问题解决方案可能会以完全不同的方式解决。在目前的形式下,这是无法回答的。链接的文章并没有说二传手和传接手是错误的;在某些情况下,它们是错误的。@Gorpik:我不知道你是如何从那篇文章中读到这一点的。它增加了基本运算符和其他函数的缺乏,几乎每个成员数据项都有getter和setter,因此,类用户必须使用getter和setter来处理其他函数。如果它们本身是错误的,那么像C automatic properties这样的构造将立即出错。@Gorpik:请注意,这篇文章只提到了这一点,表明您处理的是准类,而不是必需的。请参阅,了解我对getter和setter的一些扩展看法。