问题很难用标题中的几个词来描述。因此,我有一个管理器,他管理由用户实现的某些类型的对象。对象可以有两种类型,例如,正型和负型。所以我想让用户通过类声明来设置这个选项。显而易见的方式:
class Base;
class BasePositive : Base;
class BaseNegative : Base;
class UserObject1 : public BasePositive;
class UserObject2 : public BaseNegative;很好,效果很好。但是如果我们想要使用继承:
class UserObjectBase : public BasePositive;
class UserObject3 : public UserObjectBase;Ops,所有来自UserObjectBase的派生类只能是正的。我希望获得用户可靠的机制来声明自己的类并设置类型为正或负(例如)。因此,我已经搜索了一些机制来覆盖基类中的某个字段/属性(不管它是什么--只要实现它)。
真的,我没有看到任何没有宏的解决方案。但可能是别人知道的?
C++11 -扩展不能使用(我想要,但不能)。
更新:
通过虚拟继承,我取得了一些成功:
#include <iostream>
struct base {
~base() {}
int value;
bool isPositive;
};
struct pos : virtual base {
pos() {
isPositive = true;
}
};
struct neg : virtual base {
neg() {
isPositive = false;
}
};
struct foobase : pos {};
struct fooNeg : virtual foobase, virtual neg {};
struct fooPos : foobase {};
int main(int argc, char const *argv[])
{
fooNeg f;
std::cout << f.isPositive << "\n";
fooPos p;
std::cout << p.isPositive << "\n";
return 0;
}但正如我所知,虚拟继承是一种糟糕的做法。看别的东西..。
发布于 2012-09-10 09:30:41
你是在寻找纯粹的虚拟函数吗?
class Base {
public:
enum Polarity { POSITIVE, NEGATIVE };
virtual Pole polarity() const = 0;
};这迫使用户声明他们的类是正的还是负的,并且仍然会在层次结构中留下一个选择。
发布于 2012-09-10 09:44:28
你会不会想表达一种“拥有-一种”与“是-一种”技术的关系?
乍一看,似乎所有的用户类都有-a极性。通过(单一)继承来表达这个属性是很尴尬的,而且实际上是针对您遇到的问题:用户必须选择一个类是包含正值还是负值,尽管他的子类可以两者兼而有之。
作为约阿希姆,多重继承可能是一种简单的方法来表达用户类的极性,但大多数时候我使用它时,它带来的不是好的而是坏的。一定要读迈尔斯的那篇文章;至少,让它成为私密的!
也许继承不是解决这个问题的一个干净的解决方案。Pmr's提示也指向这个方向。在添加另一个区分属性时出现的可伸缩性问题,例如离散/连续、高/低、.
您的客户端代码可能会变得比您想要的更详细,但至少,您不会被迫进行类爆炸!
发布于 2012-09-10 09:32:24
请记住,C++可以处理多个继承,因此可以使用单独的基类并将它们组合起来。类似于:
class PosNegBase;
class Positive : public PosNegBase;
class Negative : public PosNegBase;
class UserObjectBase;
class UserObject3 : public UserObjectBase, public Positive;
class UserObject4 : public UserObjectBase, public Negative;https://stackoverflow.com/questions/12348837
复制相似问题