精华内容
下载资源
问答
  • 尽管纯虚析构函数在标准C++中是合法的,但在使用时有一额外的限制:必须 为纯虚析构函数提供一函数体 纯虚析构函数和非纯虚析构函数之间唯一的不同之处在于纯虚析构函数使得 基类是抽象类,所以不能创建一基类...

    尽管纯虚析构函数在标准C++中是合法的,但在使用时有一个额外的限制:必须
    为纯虚析构函数提供一个函数体

    纯虚析构函数和非纯虚析构函数之间唯一的不同之处在于纯虚析构函数使得
    基类是抽象类,所以不能创建一个基类的对象

    //: C15:UnAbstract.cpp
    // From Thinking in C++, 2nd Edition
    // Available at http://www.BruceEckel.com
    // (c) Bruce Eckel 2000
    // Copyright notice in Copyright.txt
    // Pure virtual destructors 
    // seem to behave strangely
    
    class AbstractBase {
    public:
      virtual ~AbstractBase() = 0;
    };
    
    AbstractBase::~AbstractBase() {}
    
    class Derived : public AbstractBase {};
    // No overriding of destructor necessary?
    
    int main() { Derived d; } ///:~

    一般来说,如果在派生类中基类的纯虚函数没有重新定义,则派生类将会
    成为抽象类

    当我们的类仅含有一个纯虚函数时,就会发现这个唯一的差别:析构函数

    运行下面的程序,可以看到在派生类版本之后,随着任何其他的析构函数,
    调用了纯虚函数体

    //: C15:PureVirtualDestructors.cpp
    // From Thinking in C++, 2nd Edition
    // Available at http://www.BruceEckel.com
    // (c) Bruce Eckel 2000
    // Copyright notice in Copyright.txt
    // Pure virtual destructors
    // require a function body
    #include <iostream>
    using namespace std;
    
    class Pet {
    public:
      virtual ~Pet() = 0;
    };
    
    Pet::~Pet() {
      cout << "~Pet()" << endl;
    }
    
    class Dog : public Pet {
    public:
      ~Dog() {
        cout << "~Dog()" << endl;
      }
    };
    
    int main() {
      Pet* p = new Dog; // Upcast
      delete p; // Virtual destructor call
      getchar();
    } ///:~

    作为一个准则,任何时候我们的类做都要有一个虚函数,我们应当立即增加
    一个虚析构函数

    输出
    ~Dog()
    ~Pet()

    展开全文
  • 而对于析构函数,这样不行,不论是虚的还是非虚的 在析构函数中,只有成员函数的 本地 版本被调用,虚机制被忽略 //: C15:VirtualsInDestructors.cpp // From Thinking in C++, 2nd Edition /...

    在析构期间,有一些我们可能不希望马上发生的情况。

    如果正在一个普通的成员函数中,并且调用一个虚函数,则会使用晚捆绑机制
    来调用这个函数

    而对于析构函数,这样不行,不论是虚的还是非虚的

    在析构函数中,只有成员函数的 本地 版本被调用,虚机制被忽略

    //: C15:VirtualsInDestructors.cpp
    // From Thinking in C++, 2nd Edition
    // Available at http://www.BruceEckel.com
    // (c) Bruce Eckel 2000
    // Copyright notice in Copyright.txt
    // Virtual calls inside destructors
    #include <iostream>
    using namespace std;
    
    class Base {
    public:
      virtual ~Base() { 
        cout << "Base1()\n"; 
        f(); 
      }
      virtual void f() { cout << "Base::f()\n"; }
    };
    
    class Derived : public Base {
    public:
      ~Derived() { cout << "~Derived()\n"; }
      void f() { cout << "Derived::f()\n"; }
    };
    
    int main() {
      Base* bp = new Derived; // Upcast
      delete bp;
      getchar();
    } ///:~

    在析构函数的调用中,Derived::f()没有被调用,即使f()是一个虚函数

    假设在析构函数中使用虚机制,那么调用下面这样的虚函数是可能的:这个
    函数是在继承层次中比当前的析构函数“更靠外的”

    输出
    ~Derived()
    Base1()
    Base::f()

    展开全文
  • 析构函数与合成析构函数

    千次阅读 2012-02-28 16:37:33
    今天看《c++ primer》的时候,突然看到合成析构函数名词,对析构函数了解的多点,对合成析构函数则了解的不析构函数特点: 1.整个类只有一,即不能重载; 2.没有形参; 3.没有返回值; 4.不能被继承...

    今天看《c++ primer》的时候,突然看到合成析构函数这个名词,对析构函数了解的多点,对合成析构函数则了解的不多。

    析构函数特点:

    1.整个类只有一个,即不能重载;

    2.没有形参;

    3.没有返回值;

    4.不能被继承(继承的是成员变量和成员函数,个人理解严格说这些构造函数,析构函数不能称之为“函数”,因为不符合函数定义的特征,所以构造函数,析构函数不能被继承)

    5.可以手动调用(不理解为什么允许这么做)

    关于这个合成析构函数,《c++ primer 第四版》这么说的:

    ……编译器总会 为我们合成一个析构函数……合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员,对于类类型的成员,合成析构函数调用该成员的析构函数来撤销对象……即使我们编写了自己的析构函数,合成析构函数依旧运行……

    这里有以下几点理解:

    1.合成析构函数不管你建不建析构函数他都有;

    2.合成析构函数负责销毁对象本身,例如我们对象含有一个int成员时,合成析构函数可以回收这个int成员占用的空间(一个不含有成员变量的类的sizeof=1);这是合成析构函数真正做的事情;

    3.我们的析构函数是对合成析构函数的扩展,所以我们常常在合成析构函数中析构堆中的资源;

    4.按照合成析构函数和析构函数的分工,可以理解必然是先运行手动建立的析构函数,再运行合成析构函数;

    以上是关于析构函数和合成析构函数的理解。

    展开全文
  • qwidget析构函数调用次问题 pInstance是我new出来的一QWidget,并且这是使用单例模式, 如果析构函数使用delete pInstance;这时候析构函数会调用次!无限循环,不清楚非单例模式是否会有这样的情况。 解决...

    qwidget析构函数调用多次问题


    pInstance是我new出来的一个QWidget,并且这个是使用单例模式,
    如果析构函数使用delete pInstance;这时候析构函数会调用多次!无限循环,不清楚非单例模式是否会有这样的情况。
    解决这个问题的方法就是使用deleteLater。
    pInstance->deleteLater()

     Qt子窗体关闭时,不执行析构函数

    子窗体的构造函数中初始化了父窗体的parent,当关闭子窗体时不会调用析构函数,

    只有关闭父窗体时,才会调用子窗体的析构函数,

    解决办法如下

    setAttribute(Qt::WA_DeleteOnClose);

    写在子窗体的构造函数就可以了~

    部分内容参考摘抄自:

    https://blog.csdn.net/qq_33485434/article/details/84839052

    仅供学习使用,如需转载请自己联系原作者!

    展开全文
  • 析构函数

    2021-03-11 12:20:57
    析构函数的定义 析构函数: 当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统会自动执行析构函数。析构函数往往用来做...换言之,一个类可以有多个构造函数,但是只能有一个析构函数 何时调用析构函数
  • 浅析:类只能有一个析构函数

    千次阅读 2015-04-01 12:42:11
    类的构造函数与析构函数都是与类同名(析构函数需要加上'~'),没有返回值的;...但是由于析构函数是没有参数的,那么从而无法通过参数的不同来达到重载多个析构函数的目的,从而析构函数只能有一个。 析构函数是由系
  • 最近做的一项目是基于PHP4的, 习惯了PHP5的面对对象,面对PHP4,难免会有很不爽:不支持public, static, private, protected关键字, 最郁闷的是,不支持析构函数:本文就将借助PHP的register_shutdown_function来在...
  • 相信很初学者学习php面向对象时会接触两函数,构造函数与析构函数。构造函数似乎用的更析构函数用的较少(相对初学者有限编程经验而言,笔者也是如此。)在功能上,构造函数在创建对象时调用,析构函数在对象...
  • 因为编译器帮你做了很的事情,一般我们的内存泄露是堆的内存忘了释放,这释放堆的内存一般情况下也是好多书籍强调的,但是假如没有合成析构函数的话,你人为的需要释放的东西就很了,比如你定义的
  • 但是对于析构函数来说,子类 与父类在销毁对象时,都应该要调用 ,所以把父类的析构函数定义为虚函数,会发生什么事情呢。 class  { public:  A(){cout  virtual ~A(){count };
  • C++析构函数

    2021-02-12 09:55:21
    析构函数 1.析构函数定义 2.析构函数作用 执行用户希望在最后一次使用对象之后所执行的任何操作,通常用来...一个类可以有多个构造函数,但只能有一个析构函数 用户没有定义析构函数,系统会自动生成一个析构函数 ...
  • C++ 析构函数

    万次阅读 多人点赞 2016-09-21 00:02:15
    析构函数如果我们不写的话,C++ 会帮我们自动的合成一个,就是说:C++ 会自动的帮我们写一个析构函数。很时候,自动生成的析构函数可以很好的工作,但是一些重要的事迹,就必须我们自己去写析构函数。 析构函数...
  • 构造函数与析构函数

    2016-02-16 14:46:56
    类都具有构造函数和析构函数。其中,构造函数在定义对象时被调用,析构函数在...析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构函数与普通函数最大的区别。
  • (二)析构函数析构函数的...②不返回任何值,没有函数类型,也没有函数参数,由于无函数参数,则不能被重载,一个类只能有一个析构函数,但可以有多个构造函数。 ③一般情况下,在声明类的同时就定义析构函数。 ...
  • 今天我们来谈一谈面试 C++ 工程师时经常被谈到的一个问题:为什么析构函数必须是虚函数?为什么默认的析构函数不是虚函数? 首先,我们看一下百度百科对虚函数是怎么定义的: 在某基类中声明为 virtual并在一个或多个...
  • 析构函数:当基类指针指向在堆内实现的派生类的动态对象时,virtaul声明的基类析构函数是告诉编译器,还要调用派生类的析构函数。虚基类:当派生类有多重继承和继承时,在继承链上有两子类继承自同一基类时,...
  • 1.每个析构函数(不加 virtual) 只负责清除自己的成员。 2.可能有基类指针,指向的确是派生类成员的情况。(这是很正常的), 那么当析构一个指向派生类成员的基类指针时,程序就不知道怎么办了。 所以要保证运行...
  • 析构函数是不能为虚函数的。但析构函数能够且常常必须是虚的 构造函数有一项特殊工作,即一块一块地组合成一对象 构造函数和析构函数是类层次进行调用的唯一地方 通常,析构函数的执行是相当充分的 如果这...
  • 个析构函数(不加 virtual) 只负责清除自己的成员。 2.可能有基类指针,指向的确是派生类成员的情况。 对于第二种情况: 正确执行:基类指针可以指向派生类的对象(态性),如果删除该指针delete []p;就会调用...
  • 关于析构函数

    2018-12-04 23:00:11
    polymorphic(带多态性质的) base...classes的设计目的如果不是作为base classes使用,或不是为了具备态性(polymorphically),就不该生命virtual 析构函数析构函数绝对不要吐出异常。如果一析构函数调用的...
  • 析构函数

    2017-03-13 20:11:39
    析构函数在C++中不能声明虚构造函数,但是可以声明虚析构函数。...析构函数声明为虚函数后,在使用指针或引用时可以动态绑定,实现运行时的台,保证使用基类类型的指针就能调用适当的析构函数针对不同的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,365
精华内容 946
关键字:

多个析构函数