如何从基类中打印出派生类名,而不必将构造函数一直关闭.换句话说,是否可以从基类严格执行此操作而不在每个派生类中添加代码?
这是我得到的一个例子,如果有一种方法我想摆脱构造函数链接.
编辑: 理想情况下,我正在寻找添加到基类中的东西,而无需编辑所有派生类.目前我的真实代码已经有17个类(需要更多),所以可以直接从基类完成工作的东西是理想的.即使它是特定于编译器的(g ++或clang).
#include <iostream>
class Base {
public:
Base(std::string id) {
std::cout<<"Creating "<<id<<std::endl;
}
};
class Child : Base {
public:
Child(std::string id) : Base(id) {}
Child() : Base(typeid(this).name()) {}
};
class GrandChild : Child {
public:
GrandChild(std::string id) : Child(id) {}
GrandChild() : Child(typeid(this).name()) {}
};
class GrandGrandChild : GrandChild {
public:
GrandGrandChild(std::string id) : GrandChild(id) {}
GrandGrandChild() : GrandChild(typeid(this).name()) {}
};
int main() {
GrandGrandChild *A = new GrandGrandChild();
GrandChild *B = new GrandChild();
Child *C = new Child();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
Creating GrandGrandChild
Creating GrandChild
Creating Child
Run Code Online (Sandbox Code Playgroud)
但随着编译添加前缀.
遗憾的是没有简单的解决方案.
问题是构造多态对象非常复杂,在构建类的Base
子部分的那一刻Child
,你正在构建一个Base
静止而不是一个Child
(因为尝试访问Child
成员将是非感性的,它们尚未构建! )
因此,所有检索动态信息的方法(称为RTTI或运行时类型信息)都会被自动锁定以防止出现此类错误.
出于对称原因,析构函数中也会出现相同的情况.
现在,只有构造函数和析构函数被锁定,因此您可以完美地拥有一个name()
方法,可以在所有其他情况下愉快地返回实例的动态类型的真实名称:
class Base {
public:
std::string name() const { return typeid(*this).name(); }
};
Run Code Online (Sandbox Code Playgroud)
它将工作...除非你从构造函数或析构函数调用它,在这种情况下它将报告静态类型.
现在,就"奇异"输出而言,每个实现(编译器)都允许在这里提供自己的输出(对于不同类型它们甚至不需要不同,疯狂呃!).你似乎在使用gcc或clang.
有demanglers来解释这样的输出,或者如果你的程序很简单并且它们的界面让你害怕,你可能只是尝试手动解析它来删除这些输出.该类的名称应该完整显示,它之前只是一些废话(名称空间和数字本质上).
归档时间: |
|
查看次数: |
8954 次 |
最近记录: |