首先是:析构函数和构造函数,复制构造函数,赋值都是不一样的一点就是,析构函数即使你人为定义了一个的话,编译器还是会为你合成一个合成析构函数。个人感觉这点是一个很人性化也是对于菜鸟级别的coder的一个很好的帮助,因为编译器帮你做了很多的事情,一般我们的内存泄露是堆的内存忘了释放,这个释放堆的内存一般情况下也是好多书籍强调的,但是假如没有合成析构函数的话,你人为的需要释放的东西就很多了,比如你定义的string,比如int等等(不考虑栈结束的释放,仅仅一般的时候)。所以书上说无论你定义析构函数与否,合成析构函数都运行。
后来见到一个问题就是说对于纯虚析构函数一定不要忘记在类的外面要进行定义,当时不解原理,因为纯虚函数是可以不要定义的,但是析构函数为何呢?我们知道的是虚析构函数对于多态而言是比不可少的,因为可以避免的一个问题就是在比如如下的情况下造成的部分析构,
class A{};
class B:public A
{};
A *op=new B;
delete op;
上面的问题是很简答的,假如A中(虽然没有定义,但是有)的析构函数是非虚的话,就会造成只是秒杀掉了op指向的对象中A类部分元素。有点像剪切。
但是我们为何要对于一个纯虚析构函数(实际上对于一个析构函数也是)进行定义呢?那就是一个析构的顺序的问题,析构的话肯定是先子类自定义析构,之后是子类合成的析构
在就是父类的自定义析构,再是合成的析构,父类中的那个自定义的析构定义是必须的了。
#include<iostream>
using namespace std;
class A
{
public:
~A(){};
};
class B:public A
{
public:
~B(){cout<<"~B()"<<endl;}
};
int main()
{
B b;
return 0;
}
还有一个问题就是具体的对于类之中的各个成员函数调用,成员调用的底层实现机制是什么呢?这里PS下:父类之中的构造函数等等函数的玩意实际上是在代码去放着的,那么子类中的父类中在代码区里面的各个函数之间的关联是怎样的呢?他们之间的调用的底层是怎么实现的呢?高手解救~~~