当前位置: 首页 > news >正文

seo工具共享网站做平面vi网站

seo工具共享网站,做平面vi网站,WordPress都可以做什么,宝应人才网点击 C 语言编程核心突破 快速C语言入门 C 类型擦除与状态保留 前言一、一个正常的继承和多态二、一个不太正常的继承和多态三、试图构建能类型抹除但保留状态的mySharedPtr类总结 前言 要解决问题: 在C中, 类型决定着对象的数据存储和解释, 以及方法. 通过继承和虚… 点击 C 语言编程核心突破 快速C语言入门 C 类型擦除与状态保留 前言一、一个正常的继承和多态二、一个不太正常的继承和多态三、试图构建能类型抹除但保留状态的mySharedPtr类总结 前言 要解决问题: 在C中, 类型决定着对象的数据存储和解释, 以及方法. 通过继承和虚函数, 可以实现多态. 本文写一条邪路, 试图不用virtual修饰析构函数, 但在delete基类指针时, 调用子类的析构函数. 想到的思路: 我能想到的唯一思路, 是通过模板实现泛型, 通过lambda或函数指针抹除类型信息, 保留类型状态. 其它的补充: 本文完全是邪路子, 不要学, 只是作为C灵活性的某种探讨, 虚函数才是正路. 一、一个正常的继承和多态 最简化模型, 只有析构函数, virtual修饰, 正常情况直接delete可以调用正确的析构函数, 使用shared_ptr也正确: #include cstdio #include memoryusing std::shared_ptr;class Base {public:virtual ~Base(){printf(~Base()\n);} };class Derive : public Base {public:~Derive() override{printf(~Derive()\n);} };auto main() - int {Base *ptr new Derive;delete ptr;shared_ptrBase test(new Derive);return 0; }二、一个不太正常的继承和多态 我们人为的不给基类析构函数加virtual修饰, 看看结果: #include cstdio #include memoryusing std::shared_ptr;class Base {public:~Base(){printf(~Base()\n);} };class Derive : public Base {public:~Derive(){printf(~Derive()\n);} };auto main() - int {Base *ptr new Derive;delete ptr;shared_ptrBase test(new Derive);return 0; }结果是调用子类析构错误, 如果含有资源, 那么就已经泄漏了. ~Base() ~Derive() ~Base() 然而, 你没看错, 使用shared_ptr智能指针, 没有错误析构, 非常奇怪, 细究起来, 除非能够在存储时抹除类型(化为基类指针), 调用时使用正确类型(化为子类指针)才能达到这种效果, C有这种方法么, 鄙人愚拙, 实在是只掌握C皮毛, 除了虚函数, 好像没见过其它实现手段. 三、试图构建能类型抹除但保留状态的mySharedPtr类 类型一旦抹除, 将无法保留, 但可以通过模板函数或lambda, 保留状态. 下面的代码就是用模板函数保留类型的状态, 其实就是利用模板的性质, 在编译期间, 产生一个接收void*万能指针, 但在内部能处理特定类型指针的函数, 详见funcDelete. #include cstdio #include memoryusing std::shared_ptr;class Base {public:~Base(){printf(~Base()\n);} };class Derive : public Base {public:~Derive(){printf(~Derive()\n);} };// 形参抹除指针类型, 内部保留类型状态 template typename Temp void funcDelete(void *data) {// 由于data类型信息被抹除, 无法使用dynamic_castdelete static_castTemp *(data); }// 简化funcDelete函数指针类型 using delType void (*)(void *);template typename Temp struct mySharedPtr {// 构造函数, 抹除data类型, 通过funcDelete函数指针保存类型状态template typename TempDeriveexplicit mySharedPtr(TempDerive *data_): data(data_){deleter funcDeleteTempDerive;}// 析构函数, 调用有原始指针类型的deleter函数指针~mySharedPtr(){deleter(data);}private:Temp *data nullptr;delType deleter nullptr; };auto main() - int {Base *ptr new Derive;delete ptr;shared_ptrBase test(new Derive);mySharedPtrBase testB(new Derive);return 0; }还有更为简洁的, 或说更为C的方法, 通过lambda抹除类型, 保留状态: #include cstdio #include functional #include memoryusing std::shared_ptr;class Base {public:~Base(){printf(~Base()\n);} };class Derive : public Base {public:~Derive(){printf(~Derive()\n);} };template typename Temp struct mySharedPtr {// 构造函数, 抹除data类型, 通过lambda保存类型状态, 也就是原始指针template typename TempDeriveexplicit mySharedPtr(TempDerive *data_): data(data_){deleter [data_]() { delete data_; };}// 析构函数, 调用有原始指针类型的deleter函数指针~mySharedPtr(){deleter();}private:Temp *data nullptr;std::functionvoid() deleter nullptr; };auto main() - int {Base *ptr new Derive;delete ptr;shared_ptrBase test(new Derive);mySharedPtrBase testB(new Derive);return 0; }通过lambda自行推断捕捉的变量类型, 并保留在内部状态中, 此操作很变态, 极度简洁且高效, 但我个人觉得有个小问题, 就是每个lambda都是一个类型, 这个和函数指针有天壤之别, 所以运行效率不一定比原始的函数指针好. 总结 通过上面示例, 我们实现了不用虚函数达到基类指针调用子类析构的目的, 比虚函数的实现还是要复杂一些, 并且不是太推荐, 只是作为一种尝试, 毕竟C灵活性确实是可以支持你为所欲为. 点击 C 语言编程核心突破 快速C语言入门
http://www.pierceye.com/news/552053/

相关文章:

  • 网站开发 发送邮件功能深圳做分销商城网站
  • 网站备案 取消网上智慧团建官网入口
  • 网站开发 无代码app 外包开发公司
  • 做网站应该用什么配置的手提电脑免费微商城小程序模板
  • 义乌外贸网站建设公司服务外包和劳务外包区别
  • 四川长昕建设工程有限公司网站兰州网站哪里做
  • 电子商务网站规划与管理申请一个域名后怎么做网站
  • 中小企业网站制作方法桂林景区网站策划
  • shopify做全品类网站提交链接
  • 网站建设和运营哪家公司好宠物医疗设计素材网站
  • 泰州网站制作公司中国空间站机械臂
  • 信誉好的常州网站建设网监备案网站更换域名
  • 淮南品牌网站建设电话南昌网站建设q479185700棒
  • 富阳区住房和城乡建设局网站广州市住房保障和房屋管理局
  • 江门建设局网站上海住房和城乡建设部网站
  • 开一个网站需要什么建设商务网站的方案
  • asp.net网站开发 pdf全球互联网中心在哪里
  • 做外贸网站要有域名学什么可以做网站
  • 服装高级定制品牌app排名优化
  • 济南推广网站建设保定seo网络推广
  • 网站运营策略wordpress调用友情链接
  • 网站流量下降原因京津冀协同发展四区指的是
  • 北滘网站设计网站建设应解决的问题
  • 网站建设空间申请wordpress 学校主题
  • 长沙市建设工程质量安全监督站官方网站做网站入门看什么书
  • 网站设计 素材代账行业门户网站开发
  • 旅游公司网站开发与实现如何建立公司网站
  • 专门做金融培训的网站有哪些wordpress注册没反应
  • 网站备案部门建设厅焊工证什么样子
  • 南宁市建设工程质量监督站网站设计模式