0

问题不容易用标题中的几个词来描述。所以,我有一个管理用户实现的某些类型对象的经理。对象可以是 2 种类型,例如 - 正面和负面。所以我想让用户通过类声明来设置这个选项。明显方式:

class Base;
class BasePositive : Base;
class BaseNegative : Base;

class UserObject1 : public BasePositive;
class UserObject2 : public BaseNegative;

很好,效果很好。但是如果我们想使用继承:

class UserObjectBase : public BasePositive;
class UserObject3 : public UserObjectBase;

操作,所有来自 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;
}

但正如我所知,虚拟继承是不好的做法。看别的东西...

4

3 回答 3

1

难道你正在寻找纯虚函数?

class Base {
public:
  enum Polarity { POSITIVE, NEGATIVE };
  virtual Pole polarity() const = 0;
};

这迫使用户声明他们的类是正面的还是负面的,并且仍然会在层次结构的下方留下选择。

于 2012-09-10T09:30:41.083 回答
1

是不是你想用“is-a”技术来表达“has-a”关系?

乍一看,似乎所有用户类都“有”极性。通过(单一)继承来表达这个属性很尴尬,并且确实会导致您遇到的问题:用户必须选择一个类是否包含正值或负值,尽管他的子类可能两者都包含。

Joachim 建议的多重继承可能是一种实现简洁方式来表达用户类极性的技术,但大多数时候我使用它,它带来的坏处多于好处。请阅读Meyers 的文章;至少,将其设为私有!

也许继承并不是这个问题的干净解决方案。 Pmr 的暗示也指向了这个方向。想象一下当您添加另一个区分属性时出现的可扩展性问题,例如离散/连续、高/低、...

您的客户的代码可能会变得比您想要的更冗长,但至少,您不会被迫陷入类爆炸!

于 2012-09-10T09:44:28.697 回答
0

请记住,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;
于 2012-09-10T09:32:24.063 回答