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

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

如果基本函数是虚拟的,我会理解V表的参与,该表保留了基本函数的地址。但是在这里,基本指针隐藏派生对象可以设法调用基本函数。

任何人都可以对幕后发生的事情有所了解吗?
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();
}

最佳答案

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

如果将方法A::disp()声明为virtual,则只有它会在运行时解析。它可以根据A::disp()指向的对象来调用B::disp()a_ptr

简单来说

  • 如果声明方法virtual,则编译器知道
    方法必须在运行时进行评估。同样,必须使用指针或引用来调用该方法。
  • 如果使用对象调用该方法,或者未使用该方法virtual然后编译器立即将对方法的调用
    call 者的静态类型。

  • 在您的情况下,调用方的静态类型是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;
    

    [注意:假设如果仅将B::disp()用作virtual,并保持A::disp()正常方法不变,那么您仍将获得与现在相同的结果。]

    关于c++ - 基本指针中的派生对象如何调用基本函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6771363/

    10-13 08:19