C++对象模型之函数成员(3)

原创 2004年01月27日 21:09:00

1.1.1. 多重继承下的虚成员函数

0001   class Base1
0002   {
0003   public :
0004     Base1();
0005   virtual ~Base1();
0006   virtual void speakClearly();
0007   virtual Base1 *clone() const;
0008   protected :
0009     float data_Base1;
0010   };
0011   class Base2
0012   {
0013   public :
0014     Base2();
0015     virtual ~Base2();
0016     virtual void mumble();
0017     virtual Base2 *clone() const;
0018   protected :
0019     float data_Base2;
0020   };
0021   class Derived : public Base1, public Base2
0022   {
0023   public :
0024     Dervied();
0025     virtual ~Dervied();
0026     virtual Dervied *clone() const;
0027   protected :
0028     float data_Dervied;
0029   };<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Dervied支持虚函数(virtual function)的难度在于Base2 Subobject,有三个问题待解决:

1)   析构函数

2)   Base2::mumble();

3)   一组clone函数

多重继承下,一个派生类产生n-1个额外的虚函数表,用于表示基类(上一层)的数目,单一继承也可以看作特殊的多重继承。对象模型如下所示:

 

Base1 object             Base1 Virtual Function Table

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />data_Base1

_vptr_Base1

#0

type_info for Base1

#1

Base1::~Base1()

#2

Base1::clone()

#3

Bae1::SpeakClearly()


Base2 object             Base2 Virtual Function Table

data_Base2

_vptr_Base2

#0

type_info for Base2

#1

Base2::~Base2()

#2

Base2::mumble()

#3

Base2::clone()


 

 

 

#0

type_info for Derived

#1

Derived::~ Derived()

#2

Base1:: SpeakClearly()

#3

Derived::clone()

#4

Base2::mumble()

Derived object                    Derived Virtual Function Table(Shared with Base1)

Base1 Object

data_Base1

_vptr_Base1

Base2 Object

data_Base2

_vptr_Base2

data_Derived

 

 

 

 

 

 


                                              Base2_Derived Virtual Function Table

#0

type_info for Derived

#1

Derived::~ Derived()

#2

Base2::mumble()

#3

Derived::clone()

                                                  

 

 

 

 

 

当一个Derived对象指定给一个Base1或Derived指针,被处理的virtual Table为主要表格vtbl_Derived指针,而将一个Derived对象指派给一个Base2指针,被处理的virtual Table是次要表格vtbl_Base2_Derived。

有三种情况后继的Base Class会影响virtual function的支持:

1)   通过后继的Base Class指针调用Derived Class virtual function。也就是前述1)

Base2 *pb2 = new Derived;

delete pb2;

//C++伪代码

Derived *tmp = new Derived;

Base2 *pb2 = temp ? temp + sizeof(Base1) : 0;

(*pb2->vptr[1])(pb2 - sizeof(Base1));

2)   通过Dervied class 指针,调用后继的Base class中的继承而来的virtual function。也就是前述2)

Derived *pb = new Derived;

pd->mumble();

//C++伪代码

Derived *pd = new Derived;

(*pd->vptr[2])();

3)   发生在语言扩充性质下,允许一个virtual function 的返回值类型有所变化,可能是Base type也可能是publicly derived type。也就是前述3)

Base2 *pb1 = new Derived;

Base2 *pb2 = pb1->Clone();

//C++伪代码

Derived *tmp = new Derived;

Base2 *pb1 = temp ? temp + sizeof(Base1) : 0;

Derived *temp = (*pb1->vptr[3])();

Base2 *pb2 = temp ? temp + sizeof(Base1) : 0;

ExcelVBA编程系列之对象模型(3):趣谈ExcelVBA编程中的对象、方法和属性

ExcelVBA编程系列之对象模型(3)—— 趣谈ExcelVBA编程中的对象、方法和属性 享有电子表格先生美誉的John Walkenbach为了帮助人们理解VBA中的对象、属性和方法之间的...
  • Augusdi
  • Augusdi
  • 2011年07月17日 21:52
  • 942

C++对象模型之函数成员(1)

第三章 函数成员1.1.   成员函数的三种调用方式1.1.1. 非静态成员函数非静态成员函数的效率和非成员函数相同,也就是说float magnitude(const Point3d * _this...
  • wxcwuxuchun
  • wxcwuxuchun
  • 2004年01月27日 21:09
  • 1139

C++对象模型之函数成员(2)

1.1.   虚成员函数1.1.1. 单一继承下的虚成员函数0001   class Point0002   {0003   public :0004     virtual ~Point();000...
  • wxcwuxuchun
  • wxcwuxuchun
  • 2004年01月27日 21:09
  • 672

C++对象模型之函数成员(5)

1.1.   指向成员函数的函数指针1.1.1. 静态成员函数指针double (Point::*coord)() = &Point::x;coord指向的是x的实际地址。1.1.2. 非虚拟非静态成...
  • wxcwuxuchun
  • wxcwuxuchun
  • 2004年01月27日 21:09
  • 1012

C++对象模型之函数成员(4)

1.1.1. 虚拟继承下的虚成员函数0001   class Point2d0002   {0003   public :0004     Point2d(float x=0.00, float y=...
  • wxcwuxuchun
  • wxcwuxuchun
  • 2004年01月27日 21:09
  • 689

C++成员变量指针和成员函数指针

深度探索C++对象模型这本书还有提到C++类的成员变量指针和成员函数指针,虽然在实际开发中用的不多,但是还是需要理解下。一:成员变量指针1.1 非静态成员指针类成员变量指针,实际上并不是真正意义上的指...
  • LaoJiu_
  • LaoJiu_
  • 2017年04月01日 18:00
  • 941

C++ - 对象模型之 成员函数调用

C++对象模型目录 C++ - 对象模型之 编译器何时才会自行添加构造函数 C++ - 对象模型之 内存布局 C++ - 对象模型之 成员函数调用 C++ - 对象模型...
  • Gykimo
  • Gykimo
  • 2013年02月23日 14:42
  • 2085

对象模型~

                                          (VC6实现的C++对象模型)              在C++对象模型中,类成员的分布情况:1)        ...
  • ihavenoidea
  • ihavenoidea
  • 2005年10月01日 21:51
  • 1075

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 634

C++ 对象模型详细讲解(特别容易理解)

c++对象模型系列 转    一、指针与引用 一 概括 指针和引用,在C++的软件开发中非常常见,如果能恰当的使用它们能够极大的提 高整个软件的效率,但是很多的C++学习者对它们...
  • sxh850297968
  • sxh850297968
  • 2014年11月16日 21:06
  • 2206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++对象模型之函数成员(3)
举报原因:
原因补充:

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