zoukankan      html  css  js  c++  java
  • 为什么需要虚析构函数?

    When should my destructor be virtual?
    
    When someone will delete a derived-class object via a base-class pointer.
    
    In particular, here’s when you need to make your destructor virtual:
    •if someone will derive from your class,
    •and if someone will say new Derived, where Derived is derived from your class,
    •and if someone will say delete p, where the actual object’s type is Derived but the pointer p’s type is your class.
    
    Confused? Here’s a simplified rule of thumb that usually protects you and usually doesn’t cost you anything: make your destructor virtual if your class has any virtual functions. Rationale:
    •that usually protects you because most base classes have at least one virtual function.
    •that usually doesn’t cost you anything because there is no added per-object space-cost for the second or subsequent virtual in your class. In other words, you’ve already paid all the per-object space-cost that you’ll ever pay once you add the first virtual function, so the virtual destructor doesn’t add any additional per-object space cost. (Everything in this bullet is theoretically compiler-specific, but in practice it will be valid on almost all compilers.)
    
    Note: in a derived class, if your base class has a virtual destructor, your own destructor is automatically virtual. You might need an explicitly defined destructor for other reasons, but there’s no need to redeclare a destructor simply to make sure it is virtual. No matter whether you declare it with the virtual keyword, declare it without the virtual keyword, or don’t declare it at all, it’s still virtual.
    
    By the way, if you’re interested, here are the mechanical details of why you need a virtual destructor when someone says delete using a Base pointer that’s pointing at a Derived object. When you say delete p, and the class of p has a virtual destructor, the destructor that gets invoked is the one associated with the type of the object *p, not necessarily the one associated with the type of the pointer. This is A Good Thing. In fact, violating that rule makes your program undefined. The technical term for that is, “Yuck.”

    既然继承的目的(特指public继承)是为了被复用,那么一个准备用作基类的类理应有虚函数成员,不然派生类如何被复用呢?

    派生类的正确设计思路是:在public接口不变的前提下,只去override那些虚函数成员。只有这样,才能做到“被复用”。

    在这种情况下,增加一个虚析构函数不仅不会带来额外的开销,而且是保障正确性的必要条件!

  • 相关阅读:
    一、dynamic
    一、提问方式
    金额大写
    1、过滤敏感字符
    一、简单的移动端tab头部二级下拉导航栏,向下弹出,向上隐藏
    一、简单的图片上传并预览功能input[file]
    【2019-11-16】做人和做企业是一个同心圆
    【2019-11-15】销售门槛低,但前途无量
    【2019-11-14】乐观扩宽了自己想象的范围
    【2019-11-13】看到别人的是孤独,其实是独处
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/5102185.html
Copyright © 2011-2022 走看看