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

Run time type information of base and derived classes

本文关键字:运行时 类型 信息 派生 基类      更新时间:2023-10-16

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

基本上,我试图创建一个toString/toXML方法用于日志记录的目的。我想创建一个单例(本质上是一个映射),我可以注册不同的函数,并以一种方式使它们全局可用,所以我可以有像string Singleton::toString(void* or abstractObject*)这样的东西,它会根据类型从映射中选择正确的方法。

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

这是可能的,或者我应该改变到一个不同的方法(模板可以做到这一点)?不幸的是,我无法访问有问题的类,因为它们大多数来自第三方库。

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

_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)
{
...
}

欢呼,Ned