多态的一个特殊例子

原创 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看到的结果

图1

根据上图!原因也就一幕了然了!
调用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多态性详细举例说明(很经典例子)

(一)相关类
  • free4294
  • free4294
  • 2014年09月04日 16:37
  • 27548

学习c++多态的几个小例子

//reference: http://blog.csdn.net/hackbuteer1/article/details/7475622 #include #include #include ...
  • Gone_HuiLin
  • Gone_HuiLin
  • 2016年12月02日 14:43
  • 867

多态的一个简单例子

package com; public class Animal { public int a; public void move() { System.out.println...
  • u010142437
  • u010142437
  • 2013年04月23日 21:24
  • 1161

【java】【多态】的一个小例子

首先要了解什么是多态? :在面向对象语言中,接口的多种不同的实现方式即为多态。具体来说,就是不同子类作为参数使用同一父类的方法 时的实现方法是不同的。   多态的表现形式有哪些? 1.重载ov...
  • NeoAdrian
  • NeoAdrian
  • 2016年04月10日 14:41
  • 2562

iOS多态特性

多态的特性在iOS开发,尤其是在整个app的架构搭建当中,用的比较多,一般在比较大,复杂的app中应用广泛。理解多态,能够写出比较优雅的代码,设计出优秀的应用架构。 抽象的打印机类Printer...
  • xiaowenwen1010
  • xiaowenwen1010
  • 2015年10月14日 01:08
  • 1315

一个很短但能够体现C++的多态的例子

通过用虚函数利用基类指针指向其各个派生类,减少了代码的冗余 #include  using namespace std; class USB { public: virtu...
  • qq_37018433
  • qq_37018433
  • 2017年01月22日 19:10
  • 397

多态的典型例子

多态的典型例子
  • wangyanming123
  • wangyanming123
  • 2016年04月01日 21:47
  • 209

理解java中的多态,多态的例子

当面临一个问题,有多种实现算途径的时候,要想到java中的核心:多态。 多态的思想: 概括地讲,在运用父类引用指向子类对象的情况下,基本上就用到了多态了。(当父类引用指向子类对象时,调...
  • angus_17
  • angus_17
  • 2011年10月16日 21:04
  • 13122

多态小例子

多态。没有合适的例子,想出这么个办法理解多态。如果你能想出输出内容来,就理解多态了可以飘过了……;如果你不理解多态,理解了这个例子相信你会记一辈子。 using System; using Syste...
  • szwang1
  • szwang1
  • 2013年03月12日 15:19
  • 3887

面向对象三要素:封装继承多态的阐述及示例

类、封装、继承、多态概念以及实例
  • u010402786
  • u010402786
  • 2016年05月17日 21:03
  • 1165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态的一个特殊例子
举报原因:
原因补充:

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