首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过类声明重写类属性

通过类声明重写类属性
EN

Stack Overflow用户
提问于 2012-09-10 09:27:38
回答 3查看 747关注 0票数 0

问题很难用标题中的几个词来描述。因此,我有一个管理器,他管理由用户实现的某些类型的对象。对象可以有两种类型,例如,正型和负型。所以我想让用户通过类声明来设置这个选项。显而易见的方式:

代码语言:javascript
运行
复制
class Base;
class BasePositive : Base;
class BaseNegative : Base;

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

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

代码语言:javascript
运行
复制
class UserObjectBase : public BasePositive;
class UserObject3 : public UserObjectBase;

Ops,所有来自UserObjectBase的派生类只能是正的。我希望获得用户可靠的机制来声明自己的类并设置类型为正或负(例如)。因此,我已经搜索了一些机制来覆盖基类中的某个字段/属性(不管它是什么--只要实现它)。

真的,我没有看到任何没有宏的解决方案。但可能是别人知道的?

C++11 -扩展不能使用(我想要,但不能)。

更新:

通过虚拟继承,我取得了一些成功:

代码语言:javascript
运行
复制
#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;
}

但正如我所知,虚拟继承是一种糟糕的做法。看别的东西..。

EN

回答 3

Stack Overflow用户

发布于 2012-09-10 09:30:41

你是在寻找纯粹的虚拟函数吗?

代码语言:javascript
运行
复制
class Base {
public:
  enum Polarity { POSITIVE, NEGATIVE };
  virtual Pole polarity() const = 0;
};

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-10 09:44:28

你会不会想表达一种“拥有-一种”与“是-一种”技术的关系?

乍一看,似乎所有的用户类都有-a极性。通过(单一)继承来表达这个属性是很尴尬的,而且实际上是针对您遇到的问题:用户必须选择一个类是包含正值还是负值,尽管他的子类可以两者兼而有之。

作为约阿希姆,多重继承可能是一种简单的方法来表达用户类的极性,但大多数时候我使用它时,它带来的不是好的而是坏的。一定要读迈尔斯的那篇文章;至少,让它成为私密的!

也许继承不是解决这个问题的一个干净的解决方案。Pmr's提示也指向这个方向。在添加另一个区分属性时出现的可伸缩性问题,例如离散/连续、高/低、.

您的客户端代码可能会变得比您想要的更详细,但至少,您不会被迫进行类爆炸!

票数 1
EN

Stack Overflow用户

发布于 2012-09-10 09:32:24

请记住,C++可以处理多个继承,因此可以使用单独的基类并将它们组合起来。类似于:

代码语言:javascript
运行
复制
class PosNegBase;
class Positive : public PosNegBase;
class Negative : public PosNegBase;

class UserObjectBase;
class UserObject3 : public UserObjectBase, public Positive;
class UserObject4 : public UserObjectBase, public Negative;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12348837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档