我有以下基本设置:

enum{
    BASE,
    PRIMITIVE,
    ...
};

class IUnknown{
public:
    bool inline is(int type){return inv_type == type;}
private:
    enum {inv_type = BASE};
};

class Primitive: public IUnkown{
private:
    enum {inv_type = PRIMITIVE};
};


我的问题是,我希望能够在Primitive实例上进行调用,并在type等于我在Primitive类中声明的枚举中的值时使它返回true。

我发现的唯一解决方案是将'is'函数声明为虚函数并在每个子类中都有一个副本,但是我想知道是否有可能以某种方式重新定义枚举并让IUnkown中的is函数从那里获取值

最佳答案

您可以让IUnknown类定义一个受保护的构造函数(然后必须从每个派生类中调用它)。它将使用一个枚举值并将其存储。然后将在is()方法中比较存储的值。

如果您不喜欢此方法,并且希望向IUnknown添加虚拟is()方法,但又不想在每个派生类中都定义它,则可以执行以下操作:

template <int Tinv_type>
class IUnknownT : public IUnknown{
public:
    virtual bool is(int type){return inv_type == type;}
protected:
    enum {inv_type = Tinv_type};
};

class Primitive: public IUnknownT<PRIMITIVE>{
};

10-06 04:53