虚函数对象切片

Poo*_*rna 5 c++ virtual function vtable

我的问题是参考这个问题,它解释了虚拟函数如何在对象切片的情况下工作,最终调用基类虚函数和维基百科文章解释下面代码的派生类的虚拟表布局

    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
Run Code Online (Sandbox Code Playgroud)

上面的程序输出"在A :: func".

但是如果没有用于B类的虚拟表知道基类A :: func,最终会调用A :: func

AnT*_*AnT 14

"课堂虚拟桌B"?类的虚拟表B根本不涉及oA.func()调用.对象oA具有类型A,这意味着它的虚拟表是类的虚拟表A.

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


The*_*ish 14

A oA = *ptr1;
Run Code Online (Sandbox Code Playgroud)

这会将任何成员变量复制到新的A对象中.vtable指针不是普通的成员变量,不会被复制.因此,针对此对象调用的任何后续虚函数都将充当A对象,因为它 A对象.