继承 虚函数
来源:互联网 发布:免费网页游戏源码 编辑:程序博客网 时间:2024/05/23 12:34
虽然这个方法违反了继承的规则,但是对了解虚函数有好处
子类转换成父类平滑。父类转换成子类就不可以,就像double转换成int。
#include<iostream>
using namespace std;
class A
{
public:
void virtual f()
{ cout << "A" << endl; }
};
class B:public A
{
public:
void f()
{ cout << "B" << endl; }
};
int main()
{
A * pa = new A();
pa->f();
B * pb = (B*) pa;//求解释这个会得到什么输出
pb->f();
delete pa, pb;
pa = new B();
pa->f();
pb = (B*) pa;//求解释这个会得到什么输出
pb->f();
return 0;
}
13没什么说的吧,4的话,看起来有许多未知的样子。
2的话,应该是这样理解吧。
普通成员函数被调用是直接跳转到函数,虚函数是先从类中的一个指针(编译器会帮你做这件事)找到一个虚函数地址列表,然后再按图索骥找到函数。
A对象pa被强制转换为B,也就是把pa的数据空间按照B的规则来重新管理,只是重新管理,数据不会变化。
f()是一个虚函数,在pa的数据空间里,是找不到它的(其他普通成员函数都能在此找到)。这里放的不是f(),而是一个指针,这个指针指向的是一个函数地址列表,在这个地址列表中才存放了f()的地址。
pa是对象A的时候,这个指针指向A的地址列表,pa被强制转换成B,这个指针此时的“含义”会变成B类中指向虚函数的地址列表的指针,但它的数据(所指的函数地址列表)并没有发生变化,因此作为B的pa,也就是(B*)pa,它f()时,调用的仍然是A类的虚拟函数地址列表中的f(),让然会输出A。
- 虚函数 虚继承
- 虚函数、虚继承
- 虚函数,虚继承
- 继承与虚函数
- 继承与虚函数
- 虚函数的继承
- 继承与虚函数
- 虚函数及继承
- 继承虚函数
- 继承 多态 虚函数
- c++ 继承 虚函数
- 虚函数及继承
- 虚函数继承
- 虚函数&继承
- 虚函数及继承
- 虚函数及继承
- 虚函数与继承
- 虚函数继承
- 常驻子线程实现(iOS oc)
- Java中如何把两个数组合并为一个
- COM组件开发实践(一)
- cocos2d-Lua06动作和动画切换
- table中给tr设置border-bottom无效
- 继承 虚函数
- 深度优先搜索DFS(depth first search),拓扑排序
- 【剑指offer系列】 树的子结构___18
- 【学习笔记】3D图形核心基础精炼版-4:stage3D实战-环境搭建
- tcp和udp的0字节数据
- Wininet异步读取类CHttpClient
- Ubuntu中启用关闭Network-manager网络设置问题
- JAVA之数组查询binarySearch()方法详解
- redis主备哨兵---总结