蕾欧娜 发表于 2015-4-17 09:51

C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?


  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");
     }
}





假设有如下代码:
PHP code
?

1
2
Base* pBase = new Base();
pBase->getInterface1()->func1();





其实以上代码等于:
PHP code
?

1
2
3
Base* pBase = new Base();
InterfaceU1* pInterface1 = pBase->getInterface1();
pInterface1->func1();







              C++编译后,Base类的虚函数表如下:
         PHP code
?

1
2
3
4
  
  vTable:Wrapper     |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
  vTable:InterfaceU1 |Base::func1()|
  vTable:InterfaceU2 |Base::func2()|






     如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr处的函数地址即可。
    但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1()  如果依旧使用vptr 则完全错误。
    C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
    C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)

页: [1]
查看完整版本: C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?