类之多态的理解
来源:互联网 发布:求数据恢复精灵注册码 编辑:程序博客网 时间:2024/06/10 06:11
多态的理解:
使用基类指针调用派生类成员
#include <iostream>
using namespace std;
class Left
{
public:
virtual void funleft() { cout << "funleft1" << endl; }
int left;
};
class Right
{
public:
virtual void funright() { cout << "funright1" << endl; }
int right;
};
class Bottom: public Left, public Right
{
public:
Bottom() { left = 1; right = 2; }
void funleft() { cout << "funleft2" << endl; }
void funright() { cout << "funright2" << endl; }
};
void main()
{
Bottom *b = new Bottom;
Left *l = b;
l->funleft();
Right *r = b;
r->funright();
}
运行结果:
funleft2
funright2
结果大家应该很清楚, 但是开始的时候我不明白为什么会这样.
让我们理解每段段语句 (一下全部为个人理解)
Bottom *b = new Bottom;
申请一个存放类Bottom的存储空间如图,并把首地址赋给b(其中实现了类Left和Right,派生类中的虚函数覆盖基类中的虚函数)
Left *l = b;
意思是让 I 指向 b 的首地址, 因为b已经实现了 Left,又因为 I 指向已实现类Left的首址, 所以可以用 l->funleft(); 调用了类Left中的成员函数funleft().又因为 I 为Left类型的所以I不能调用Right类型的成员 即 l->funright(); 是错误的
根据上面的理解
Right *r = b;
r指向b的首址, 可是 不是应该将r指向类Right的首址, 才能用r访问Right的成员吗?
看另一个例子
Bottom *b = new Bottom;
Right *r=b;
Right *r1=(Right *)(((int *)b)+2);//首地址加上2*4(int 类型的长度为4)
r->funright();
r1->funright();
结果为
funright2
funright2
因为指针 r 是类Right的首地址,所以 r 能调用类Right的成员
所以对上述的回答是 : 这是因为编译器将自动加上偏移量
个人总结:
派生类中的非虚函数不会覆盖基类中的非虚函数, 派生类中的虚函数则会覆盖基类中的虚函数.
一个已知类满足2个条件就可用调用自己成员 : 一是这个类已经被实现, 二是已经获得这个类的首地址(指向这个类的指针).
所以继承中 用派生类实现基类. 后可用派生类调用基类成员(因为基类在派生类中实现, 首址为派生类首址, 满足2个条件), 也可用基类指针调用基类的成员(因为基类在派生类中实现, 首址为派生类中基类的首址, 也满足个条件)。
以上全部为个人的理解 如有误 望指点
- 类之多态的理解
- java之多态的理解
- 面向对象之多态的理解
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解 Java 的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- Java基础之多线程的理解
- java复习之多线程的简单理解
- C++类的特性之多态
- java编程思想之多态理解
- 理解Java三大特性之多态
- 大规模网站架构技术原理透析
- 实用技巧:js格式化日期输出
- DNS负载均衡与负载均衡器两种方案的选择
- C/C++程序员应聘常见面试题深入剖析(1)
- 负载均衡必须要考虑的八个方案
- 类之多态的理解
- 【转】 TeX Live 下的 WinEdt 5.5 快速配置指南zz
- 将string转换成inputstream
- 个利用JMF控制摄像头拍照的程序
- 知识能力学习的CheckList
- JMF应用篇 之 从摄像头捕获视频
- 找到病根 解决本本Windows下蓝屏的方法
- 淘宝网高性能可伸缩架构技术探秘
- Oracle 11g不使用sqlplusw工具