我试图做类似的事情:
class Base {
public:
Base() {
cout << typeid(*this).name() << endl;
}
...
};
class Derived : public Base { ... }
class MoreDerived : public Derived { ... }
Derived d;
MoreDerived m;
Run Code Online (Sandbox Code Playgroud)
问题是,Base当我需要看到Derived和时,我总是被打印到屏幕上MoreDerived.有没有办法让typeid以派生类的方式工作?或者还有另一种方法typeid吗?
注意:我正在为已经编码的套件添加功能,所以我不想在基类中添加虚方法,派生类本身会返回此值.此外,不担心运行时开销,这将是调试编译开关的一部分.
ysd*_*sdx 14
在构造函数Base()中,该对象仍然是"Base"实例.它将成为Base()构造函数之后的Derived实例.尝试在施工后进行,它会起作用.
参见例如:
http://www.artima.com/cppsource/nevercall.html
sha*_*oth 10
您无法在构造函数(或析构函数)中执行此操作 - 既不使用typeid也不使用虚方法.原因是当你在构造函数中时,vtable指针被设置为正在构造的基类,因此该对象属于基类,并且在该点上没有多少多态将有所帮助.
在构造了最派生的类之后,您必须执行该代码.一种选择是使用工厂功能:
template<class T>
T* CreateInstance()
{
T* object = new T();
cout << typeid(*object).name() << endl;
return object;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14831 次 |
| 最近记录: |