C++ c++;通过枚举定义对象类型

C++ c++;通过枚举定义对象类型,c++,inheritance,enums,C++,Inheritance,Enums,我有以下基本设置: 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}; };

我有以下基本设置:

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};
};
我的问题是,我希望能够在基元实例上调用is,并在type等于我在基元类中声明的枚举中的值时使其返回true


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

enum
s本身不占用存储空间,因为它们只是
enum
变量的可接受值列表。要使虚拟函数实际使用对象的运行时类型,必须有一些运行时存储。我会使用
int
或其他什么:

enum{
    BASE,
    PRIMITIVE,
    ...
};

class IUnknown{
public:
    bool is(int type) const {return inv_type == type;}

protected:
    IUnknown(int type) : inv_type(type) { }

private:
    const int inv_type;
};

class Primitive: public IUnkown{
private:
    Primitive() : IUnknown(PRIMITIVE) { }
};

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

如果您不喜欢这样做,并且希望向IUnknown添加一个virtual 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>{
};
模板
类别IUnknown:公共IUnknown{
公众:
虚拟布尔是(int类型){return inv_type==type;}
受保护的:
枚举{inv_type=Tinv_type};
};
类原语:public IUnknownT{
};

为什么不全力以赴使用字符串而不是枚举呢

const char * baseStr = "base";
const char * derived1Str = "derived1";
const char * derived2Str = "derived2";

class base
{
public:
    virtual bool is(const char * str)
    {
        return strcmp(baseStr, str) ? false : true;
    }
};

class derived1 : public base
{
public:
    bool is(const char * str)
    {
        if ( strcmp(derived1Str, str) )
            return base::iA(str);

        return true;
    }
};

class derived2 : public derived1
{
public:
    bool is(const char * str)
    {
        if ( strcmp(derived2Str, str) )
            return derived1::is(str);

        return true;
    }
};
这样做的好处是

base * b = new derived2();
bool is = b->isA(baseStr);

is
设置为
true

我怀疑您没有正确地将多态性应用于您的问题。你不应该一开始就以这种情况结束。虚拟绑定将为每个已定义的虚拟方法确定对象的行为,而无需通过is()检查对象类型。我同意Robert的观点,似乎您正在尝试手动实现动态多态性。您可能希望避免使用名称,并研究
IUnknown
的实际使用情况,它是使用中的一大块多态代码的基础。我正在尝试为一个自制的动态类型化语言编写一个解释器,IUnter是一个模板类的基类,它必须能够存储任何类型的数据。is函数让我知道它存储的数据类型(也应该是
const
)@KerrekSB啊,是的,忘了
const
了,谢谢。我是一个健忘的人:)我想你错过了我写的IUnknownT这一事实,它源于IUnknown(除了is()方法是纯虚拟的之外,它本身与OP的版本是不变的)。