首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

悖论:多继承中的虚函数有关问题

2012-02-14 
悖论:多继承中的虚函数问题 当把派生类对象的地址赋给基类指针时,隐式的static_cast发生。这样有一个问题:

悖论:多继承中的虚函数问题

当把派生类对象的地址赋给基类指针时,隐式的static_cast发生。这样有一个问题:在多重继承的情况下,当用基类指针调用虚函数时,这个指针可能是偏移了的派生类指针,把该指针作为this传递给派生类的虚函数版本时,不会引起访问冲突吗?因为派生类的虚函数期待得到的是指向派生类对象的this指针。

class   CBaseX
{
public:

}

class   CBaseY
{
public:
virtual   void   func()   {…};
}

class   CDerived:   public   CBaseX,   public   CBaseY
{
public:
int   i;
virtual   void   func()   {   i++;   };

}


main()
{
CDerived   de;
CBaseY*   pBY   =   &de;
pBY-> func();     //   访问冲突么?
}


实例de的内部结构如下——

  &de
----->       -----
                |   ……|     (data   member   derived   from   CBaseX)
  pBY         |           |   /
----->     |_____|
                |vptr   |     (data   member   derived   from   CBaseY)
                |……   |   /
                |_____|
                |i         |
                |……   |
                |_____|



[解决办法]
深度探索c++对象模型(Inside the c++ object model) 第4章 Function语义学
讲过楼主这个问题
[解决办法]
我在我的BLOG中写了一篇文章,正好分析了这个问题:
http://blog.csdn.net/houdy/archive/2006/11/04/1366007.aspx
在VS编译器中,编译器并没有直接在 "this "指针上做手脚,而是在虚函数地址上做了手脚。这里使用了 "thunk "技术,在 "thunk "代码中,修改了 "this "指针。

[解决办法]
在VS编译器中,编译器并没有直接在 "this "指针上做手脚,而是在虚函数地址上做了手脚。这里使用了 "thunk "技术,在 "thunk "代码中,修改了 "this "指针。

=================================================================

简单地说就是在基本 "= "复制过程中插入了一小段指针调整的代码,所以获得的是自己的基类指针

热点排行