基类和派生类的运行时类型信息
Run time type information of base and derived classes
我正在尝试扩展一些我无法访问的类的功能。
基本上,我试图创建一个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
相关文章:
- 通过switch和static_cast访问多态对象的运行时类型
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 获取派生模板实例化的运行时类型
- 运行时类型推断和代码重复
- UWP,加载窗口运行时组件 == 请求的窗口运行时类型 "..." 未注册
- 为什么C++不按运行时类型销毁对象?
- 运行时类型定义
- 在C++中如何将运行时类型鉴别器映射到模板实例(无需手动枚举所有实例)
- 编译器不可知的运行时类型信息
- C++中高效的运行时类型检查
- 运行时类型信息的奇怪行为
- 运行时类型信息(为什么此代码不起作用)
- 运行时类型检查
- C++基于运行时类型实现强制转换
- C++运行时类型与 Python 模块不匹配
- 循环unique_ptrs的向量,并为运行时类型调用正确的重载
- 处理运行时类型未知的模板
- 自定义C++的运行时类型系统/库
- 基于运行时类型实例化构造函数
- 运行时类型在c++中的转换,如何