是否有可能在C中的基类销毁期间知道派生的实例类型?
发布时间:2020-12-16 09:59:38 所属栏目:百科 来源:网络整理
导读:假设我有纯A类和B类,C,D等从A派生.是否有可能从A的析构函数中知道哪个派生类正在被销毁? 解决方法 这取决于你需要什么.人们当然会在这里质疑为什么,这是一个值得怀疑的愿望. 编译时不可能随时自动从基类中知道对象的动态类型.如果您想知道编译时的类型,唯一
假设我有纯A类和B类,C,D等从A派生.是否有可能从A的析构函数中知道哪个派生类正在被销毁?
解决方法
这取决于你需要什么.人们当然会在这里质疑为什么,这是一个值得怀疑的愿望.
编译时不可能随时自动从基类中知道对象的动态类型.如果您想知道编译时的类型,唯一的解决方案是将该信息包含在基类类型本身中,这基本上就是CRTP模式.例如: class BaseBase { // body }; template <typename D> class Base : BaseBase { //body }; class Derived1 : public Base<Derived1> { // body }; class Derived2 : public Base<Derived2> { // body }; 这样,Base的析构函数将在编译时“知道”编译时派生类的类型.然而,这有一个缺点,即Derived1和Derived2的常见超类型不是Base,但是BaseBase和BaseBase析构函数不能知道(并且你可能回到正方形). 如果您只想在运行时知道(这意味着您不能直接执行DerivedClass :: something之类的操作),例如出于调试原因,您可以在包含类型info的基类中添加一个成员: class Base { protected: type_info const* type; public: Base() { type = &typeid(this); } }; class Derived : public Base { public: Derived() { type = &typeid(this); } }; 请注意,这依赖于Base构造函数将在Derived构造函数之前运行,因此类型指针将引用当前已构造的派生类最多的类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |