【问题标题】:Virtual Functions Object Slicing虚拟功能对象切片
【发布时间】:2011-03-29 15:02:19
【问题描述】:

我的问题是参考this question,它解释了虚拟函数在对象切片的情况下如何工作,最终调用基类虚函数和Wikipedia article,它解释了下面代码的派生类的虚拟表布局

    class A{

    public:
     virtual void func(){ cout<<"\n In A:func";}
    };

    class B:public A{

    public:
     virtual void func(){ cout<<"\n In B:func";}
    };

   main(){
    A *ptr1 = new B();

    A oA = *ptr1;

    oA.func(); 
  }




      DerviedClassObjectB:
         +0: pointer to virtual method table of B 

       virtual method table of B:
         +0: B::func

上面的程序输出 "In A::func" 。

但是如果 B 类的虚拟表不知道基类 A::func 怎么会最终调用 A::func

【问题讨论】:

    标签: c++ function virtual vtable


    【解决方案1】:
    A oA = *ptr1;
    

    这会将所有成员变量复制到一个新的 A 对象中。 vtable 指针不是普通的成员变量,并且没有被复制。因此,针对该对象调用的任何后续虚函数都将如同它是一个 A 对象一样,因为它一个 A 对象。

    【讨论】:

      【解决方案2】:

      B 类的虚拟表”? B 类的虚拟表根本不参与 oA.func() 调用。对象oA的类型为A,这意味着它的虚拟表是类A的。

      此外,大多数编译器都会优化oA.func() 调用,使其根本不使用任何虚拟表。由于oA 的类型在编译时已知,因此oA.func() 调用可以立即定向到A::func,而无需使用任何虚拟表。

      【讨论】:

        猜你喜欢
        • 2019-07-29
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2021-10-09
        相关资源
        最近更新 更多