65,182
社区成员




class
InterfaceU1
{
public:
virtual void func1() = 0;
}
class
InterfaceU2
{
public:
virtual void func2() = 0;
}
class
Wrapper
{
public:
virtual InterfaceU1* getInterface1() = 0;
virtual InterfaceU2* getInterface2() = 0;
}
class
Base : public Wrapper, public InterfaceU1, public InterfaceU2
{
public:
virtual InterfaceU1* getInterface1()
{
return this;
}
virtual InterfaceU2* getInterface2()
{
return this;
}
virtual void func1()
{
printf("%s", "func1");
}
virtual void func2()
{
printf("%s", "func2");
}
}
Base* pBase = new Base();
pBase->getInterface1()->func1();
Base* pBase = new Base();
InterfaceU1* pInterface1 = pBase->getInterface1();
pInterface1->func1();
vTable:Wrapper |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
vTable:InterfaceU1 |Base::func1()|
vTable:InterfaceU2 |Base::func2()|
Base* pBase = new Base();
pBase->getInterface1()->func1();
InterfaceU1* pIf = ((InterfaceU1*)pBase);
你可以尝试用printf("%p %p", pBase, pIf);打印出它们的实际值,在大部分编译器的实现下,两个值不同
所以下次在C++里做这类转换时,请用static_cast<InterfaceU1*>来提醒自己,地址已经发生改变了