悖论:多继承中的虚函数问题
当把派生类对象的地址赋给基类指针时,隐式的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 "指针。
=================================================================
简单地说就是在基本 "= "复制过程中插入了一小段指针调整的代码,所以获得的是自己的基类指针