基类和派生类的运行时类型信息

时间:2011-09-03 16:02:54

标签: c++ rtti

我正在尝试扩展一些我无法访问的类的功能。

基本上我正在尝试创建一个toString / toXML方法用于记录目的。我想创建一个单例(本质上是一个映射),我可以注册不同的函数,并以一种方式全局提供它们,所以我可以有类似string Singleton::toString(void* or abstractObject*)的东西,它会从地图中选择正确的方法,具体取决于类型。

虽然我可以使用typeid获取类型信息,但我希望能够为基类实现它,然后让所有派生类都使用该方法,除非我有一个“更接近”/更合适的方法。

这是可能的,还是应该更改为不同的方法(模板可以这样做)?不幸的是,我无法访问相关课程,因为大多数课程来自第三方图书馆。

1 个答案:

答案 0 :(得分:0)

我发现以下是一种非常简单的方法,可以跟踪我定义的基类和派生结构或类的类型。

_kind不一定是一个字符串。事实上,它可能应该是一个枚举。但是,由于我在设计一个相当高级别的程序时,字符串对我来说足够快。

struct base
{
protected:
    string _kind;
public:
    base()
    {
        _kind = "base";
    }

    ~base()
    {
    }

    string kind()
    {
        return _kind;
    }
}
struct derived : base
{
    derived()
    {
        _kind = "derived";
    }
    ~derived()
    {
    }
}

对于内置结构,可能重载toString和toXML方法并让编译器决定?

string toString(structure1 A)
{
...
}
string toString(structure2 A)
{
...
}

这可能会对派生结构造成一些混淆,但我认为编译器会选择叶结构作为类型而不是基类。

例如,如果你有类型A:B:C:D,并且函数f是为C和A定义的。如果你输入一个B类型的变量,那么它应该被自动类型化为A.如果你输入一个类型为C的变量,然后它将使用类型C的函数。如果输入类型为D的变量,则应将其自动类型化为C类型,然后调用C函数。

您也可以尝试基本上做同样事情的模板。

template <class t>
string toString(t A)
{
...
}

干杯, 奈德