加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否有可能在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构造函数之前运行,因此类型指针将引用当前已构造的派生类最多的类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读