基指针中的派生对象如何调用基函数?

shw*_*ink 1 c++ polymorphism inheritance

如何保存派生对象的基指针仍指向基函数?在这之后

a_ptr = &b_obj; 
a_ptr->disp();
Run Code Online (Sandbox Code Playgroud)

如果基本函数是虚拟的,我理解V-table的参与,它将地址保存到基函数.但是这里基本指针hodling派生对象可以管理调用基函数.

任何人都可以对幕后发生的事情有所了解吗?

class A
{
 public:
 //virtual void disp()
 void disp()
 { cout<< "From class A\n" << endl; }
};

class B : public A
{
public:
 void disp()
 { cout << "From Class B\n" <<endl; }
};

int main()
{
 A a_obj;
 A *a_ptr;

 B b_obj;

 a_ptr = &a_obj;
 a_ptr->disp();

 a_ptr = &b_obj;
 a_ptr->disp();
}
Run Code Online (Sandbox Code Playgroud)

iam*_*ind 5

基指针始终指向派生对象的基本部分.它不知道有关Derived对象成员/方法的任何信息.

如果将方法声明A::disp()virtual,则只在运行时解析它.它可以调用A::disp()B::disp()基于对象a_ptr指向.

简单来说,

  1. 如果声明方法,virtual则编译器知道必须在运行时评估此方法.此外,必须使用指针或引用调用该方法.
  2. 如果使用对象调用方法,或者方法不是, virtual则编译器立即将调用放入调用方的静态类型的方法.

在您的情况下,调用者的静态类型是A*,而方法不是virtual.因此编译器直接拨打电话A::disp(); 它不等待运行时评估.

a_ptr = &b_obj;  // static type --> typeof(*a_ptr) --> A
                 // dynamic type --> typeof(b_obj) --> B
a_ptr->disp();   // (is A::disp() virtual)?
                 // chooses B::disp() at runtime : chooses A::disp() at compiletime;
Run Code Online (Sandbox Code Playgroud)

[注意:假设你只使用B::disp()as virtual并保持A::disp()正常的方法,那么你仍然可以获得与现在相同的结果.]