多态的一个特殊例子

原创 2006年05月20日 15:03:00

我们先回复一下多态,看下面一个例子
#include "stdafx.h"
class A1
{
public:
 virtual void sample(int a,int b)=0;

};
class B1 :public A1
{
public:
virtual void sample (int a,int b){trace(“class B1:: sample”);};
  
};

class C1:public A1
{
public:
virtual void sample (int a,int b){ trace(“class C1:: sample”);};
};

int main(int argc, char* argv[])
{
 A1 a1,a2;
 B1 b1
 C1 c1;
a1=&b1;
a2=&b2;

/////////////////////////////////////////////////
a1->sample(2,3);
 a2->sample(1,3);
    //////////////////////////////////////////////
 
 return 0;
}
根据多态的特性a1->sample(2,3)调用的实际上是class B1:: sample
              a2->sample(2,3)调用的实际上是class C1:: sample
这是一个最经典的多态的例子了,这里我们不做过多解释!

自以为对多态有了很深的了解,但是下面这个例子起初使我一头雾水,”自高”的心态也就瓦解了,但总算功夫不负有心头人,总算搞清楚原因了,先看看这个例子!


#include "stdafx.h"
class A1
{
public:
 virtual void sample(int a,int b){};

};
class B1
{
 public:
  
  virtual void sample1(int a,int b){};
  virtual void sample2(int a,int b){};
  virtual void sample3(int a,int b){};
};

class C1:public A1,public B1
{
public:

 
 virtual void sample2(int a,int b){};
 virtual void sample1(int a,int b){};
 
 virtual void sample(int a,int b){};
 
void setA1(void** a){*a=(A1*)this; }
 void setB1(void** b){*b=(B1*)this; }
};

int main(int argc, char* argv[])
{
 A1 *a1,*b2;
 
 C1 c1;
c1.setA1((void**)&a1);
 c1.setB1((void**)&b2);
 
 a1->sample(2,3);
 b2->sample(1,3);
 
 return 0;
}
  按照经典的例子看a1->sample(2,3); b2->sample(1,3);这个两个调用的应该都是class C1:: sample(),令人遗憾的是a1->sample(2,3)是我们所希望看到的调用class C1:: sample(),而b2->sample(1,3);调用的却是class C1:: sample1(),这是为什么那!
下面就是我跟踪DEBUG看到的结果

根据上图!原因也就一幕了然了!
调用c1.setA1((void**)&a1);的时候,因为类CA1的原结构中虚函数表中就一项,这时候通过
*a=(A1*)this;的赋值过程,使得CA1的指针a1指向的就是c1中子对象A1虚函数表中的c1::sample(int,int).

调用c1.setB1((void**)&b1);的时候,因为类CA1的原结构中虚函数表中就一项,这时候通过
*a=(B1*)this;的赋值过程, 使得CA1的指针b1指向的就是c1中子对象B1虚函数表中第一项c1::sample1(int,int),其它的表项也就同时被切割掉了,这就解释了为什么b2->sample(1,3)为什么会转到c1::sample1(int,int)的不解了!也就是说这种情况下的赋值只有c1中子对象B1虚函数表中的第一项才被复制给b1指针!!

 

一个关于多态之虚函数的例子

程序实践多态性工资发放管理系统 目录(?)[+] 引言 本博文通过包含了一个公司支付系统中各种雇员情况的一个继承层次来讨论基类和派生类之间的关系.佣金雇员(表示为...

用一个小例子来认识Java多态

多态的类型 静态多态(编译时):重载 动态多态(运行时):重写、对象多态性 向上和向下转型 向上转型:用子类对象实例化父类,如,Animals animal=new Cat();是系统自动转换 ...
  • ADDLHX
  • ADDLHX
  • 2017年08月09日 19:13
  • 92

用一个例子说明什么是多态

OOP面向对象的三个特性:封装、继承和多态。前面两个特性好理解,多态则常常搞得很多人头晕,网上的解释也是五花八门。   什么是多态?按百度百科的解释,多态(Polymorphism)按字面的意思就...

学习多态的虚函数例子

  • 2015年10月24日 10:54
  • 586B
  • 下载

C++继承与多态例子

  • 2009年06月28日 17:13
  • 1.63MB
  • 下载

java 多态的特殊特性

最近一个阶段在学习java的多态特性,按照我个人的理解,首先多态的目的是为了更好的实现类型的兼容,其次如果子类覆盖了的方法时,如果把子类的对象赋给父类的应用,且调用父类接口的方法时,会调用子类中的方法...

一个经典c#多态的范例

  • 2012年07月23日 21:46
  • 21KB
  • 下载

再看“陈伟视频”理解多态机制 ——你还记得“橘子,苹果的例子么”

“接口你觉得是什么?”在我没有回复这集视频之前我会直接说解耦。为什么是解耦,可能我当时觉得只要在B层和D层中穿插一层,那么B层就不会直接调用D层的类的方法,这样子就达到了解耦的效果。后来我才发现了我敲...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态的一个特殊例子
举报原因:
原因补充:

(最多只允许输入30个字)