类之多态的理解

来源:互联网 发布:求数据恢复精灵注册码 编辑:程序博客网 时间: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个条件), 也可用基类指针调用基类的成员(因为基类在派生类中实现, 首址为派生类中基类的首址, 也满足个条件)。

以上全部为个人的理解 如有误 望指点


 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级小孩不爱做作业怎么办 小孩不愿多做作业怎么办 小孩一年级不自觉做作业怎么办 小孩会读不会写怎么办 好多字都不会写怎么办 写作业怎么办才能写快 五周宝宝爱玩不写字怎么办 爱玩手机的小孩怎么办? 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办 4岁宝宝不写字怎么办 四岁宝宝不写字怎么办 孩子学习粗心计算能力差怎么办 一年级的小朋友不爱看书怎么办 马上要生了害怕怎么办 孩子做题不爱读题怎么办 孩子作业写的慢怎么办 孩子学习不好怎么办我们有绝招 英语不会做题怎么办呢? 小学二年级孩子厌学怎么办 狗狗拉肚子不吃东西怎么办 小孩做作业时容易发呆怎么办 一上高速就犯困怎么办 孩子初中数学学不好怎么办 高三注意力不集中怎么办 考砸了家长打我怎么办? 高三学生困疲劳怎么办 高三晚上很困怎么办 孩子上高三压力大不想上学怎么办 高三的孩子压力大怎么办 高三复读压力大怎么办 孩子一年级做数学粗心怎么办 一年级的孩子数学总粗心怎么办