以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  一个非常有趣的问题讨论vbtl  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=15529)


--  作者:awt
--  发布时间:3/14/2005 11:05:00 AM

--  一个非常有趣的问题讨论vbtl
#include <iostream.h>
void trace(const char* msg) { cout << msg << endl ;}
class A
{
public:
virtual void  test()=0;
virtual void  AddRef() = 0;
virtual void  Release() = 0;
};

class B
{
public:
virtual void NondelegatingAddRef() = 0;
virtual void  NondelegationRelease() = 0;
};
class C : public A,public B
{
public :
virtual void AddRef() {trace("addref"); }
virtual void Release() { trace("release") ;}
virtual void NondelegatingAddRef() {trace("nonaddref");}
virtual void  NondelegationRelease() {trace("nonrelease");}
         virtual void function();
virtual void test(){trace("test");}
};

void C::function()
{B *p;
p=(B*)this;
((A*)p)->test();
}

int main()
{
C *t=new C;
t->function();
return 0 ;
}


--  作者:awt
--  发布时间:3/14/2005 11:06:00 AM

--  
程序的结果是nonaddref

呵呵,A和B是完全没有关系的2个类

C多重继承他们

((A*)p)->test();
非常有意思

p本来指向的是C类中的b部分

由于a,b是不相关的,其实上面的转换是很不安全的

完全取决于编译器,而vbtl认为p指向的是其第一个虚函数(因为test是第一个)

而p指向c中的b部分,所以是NondelegatingAddRef。


--  作者:awt
--  发布时间:3/14/2005 11:07:00 AM

--  
希望大家进来谈谈,共同进步。。。。。
--  作者:simonsun
--  发布时间:3/19/2005 10:45:00 PM

--  
呵呵,你也说了这是不安全的,完全是implementation-defined行为。这些代码是没有什么意义的也:)
--  作者:greenlixiao
--  发布时间:4/30/2005 11:40:00 AM

--  
没有任何意义
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms