虚函数 及 析构函数
来源:互联网 发布:梁朝伟 刘嘉玲 知乎 编辑:程序博客网 时间: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;
#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;
A a = (B*)&b;
那我们现在来看析构函数
假设foo是一个析构函数,他的原理完全一样
你用这种定义的时候,你在析构a对吧
他会调用a这个对象的析构函数,也就是B:foo,到这里,认为B的第一步析构就已经完成了
假设foo是一个析构函数,他的原理完全一样
你用这种定义的时候,你在析构a对吧
他会调用a这个对象的析构函数,也就是B:foo,到这里,认为B的第一步析构就已经完成了
这时候跟B就没有关系了
但是,因为B是继承A的
但是,因为B是继承A的
他等于是两层的嵌套关系
外面那层的析构完成了,需要进行里面这层的析构,就是A的析构函数,
这个跟虚函数并没有关系
假设没有虚函数的定义
你直接b = new B;
b析构的时候也会先调用B的析构,然后调用A的析构
外面那层的析构完成了,需要进行里面这层的析构,就是A的析构函数,
这个跟虚函数并没有关系
假设没有虚函数的定义
你直接b = new B;
b析构的时候也会先调用B的析构,然后调用A的析构
这也就是为什么虚析构函数可以调用A的析构,而普通函数不会调用A::foo的原因
析构函数是在a这个对象不存在的时候才调用的
析构函数是在a这个对象不存在的时候才调用的
Thank Niu for the help!
- 虚函数 及 析构函数
- 虚函数及虚函数表解析
- C++:构造函数,析构函数及友元函数
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定
- 继承下构造函数与析构函数顺序及虚函数
- 构造函数及析构函数与虚函数的关系
- 析构函数 及 指针
- 构造函数、析构函数、虚函数
- 虚函数/构造函数/析构函数
- 构造函数&析构函数&虚函数
- 构造函数、析构函数、虚函数、内联函数
- 析构函数 虚函数
- 析构函数 虚函数
- 虚函数 析构函数
- 析构函数的作用及合成析构函数
- C++虚函数及虚函数表解析
- C++虚函数及虚函数表解析
- C++虚函数及虚函数表解析代码
- CentOS5.6 安装PPTP使用vpn
- 利用XStream在Java对象和XML之间相互转换
- 用 Windows API 创建和编辑 .ini 文件
- Xcode使用教程详细讲解
- usb详解
- 虚函数 及 析构函数
- 程序写法
- Quartz 2D编程指南(1) - 概览
- HDU 1019 Least Common Multiple
- __SWI的具体分析
- 一个铜钱的故事,真正看懂的人,都成功了!
- Android自动化测试工具——robotium
- 关于数学学习(博士必读)
- openGL 背景