虚函数 及 析构函数

来源:互联网 发布:梁朝伟 刘嘉玲 知乎 编辑:程序博客网 时间:2024/05/15 09:35
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo() { cout << "A::foo() is called" << endl;}
};

class B: public A
{
public:
virtual void foo() { cout << "B::foo() is called" << endl;}
};


int _tmain(int argc, _TCHAR* argv[])
{
A * a = new B(); //
a->foo();
return 0;

} //显示 B::foo() is called


虚函数是一个空白的函数指针,需要在构造的时候对其进行绑定~!
记住这一点,这点非常重要

A的foo是一个虚函数,就是一个空白的函数指针,


在new B的时候他会发现,因为你是调用的B,所以他就将B的foo函数指针拷贝到了A中,这是你的a其实是一个A类型的对象,但是,其中的foo函数指向的不是A定义中的,而是B定义中的foo。使用new B来产生的,这是一个动态绑定的过程,叫虚函数表。
虚函数就是在构造的时候进行动态绑定的,具体怎么构造那就是他的事情了。例如 

B b;
A a = (B*)&b;



那我们现在来看析构函数
假设foo是一个析构函数,他的原理完全一样
你用这种定义的时候,你在析构a对吧
他会调用a这个对象的析构函数,也就是B:foo,到这里,认为B的第一步析构就已经完成了
这时候跟B就没有关系了
但是,因为B是继承A的

他等于是两层的嵌套关系
外面那层的析构完成了,需要进行里面这层的析构,就是A的析构函数,
这个跟虚函数并没有关系
假设没有虚函数的定义
你直接b = new B;
b析构的时候也会先调用B的析构,然后调用A的析构

这也就是为什么虚析构函数可以调用A的析构,而普通函数不会调用A::foo的原因
析构函数是在a这个对象不存在的时候才调用的


Thank Niu for the help!






原创粉丝点击