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

Posted

技术标签:

【中文标题】基指针中的派生对象如何调用基函数?【英文标题】:How derived object in base pointer invokes base function? 【发布时间】:2011-07-21 04:46:54 【问题描述】:

持有派生对象的基指针如何仍然指向基函数? 在此之后

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

如果基函数是虚拟的,我理解 V-table 的参与,它保存基函数的地址。但是在这里,存放派生对象的基指针可以设法调用基函数。

谁能解释一下幕后发生的事情?

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();

【问题讨论】:

【参考方案1】:

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

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

简单来说,

    如果你声明了一个方法virtual 那么编译器就知道这个 方法必须在运行时进行评估。此外,必须使用指针或引用调用该方法。 如果方法是使用对象调用的,或者方法不是 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;

[注意:假设您只将B::disp() 设为virtual 并保持A::disp() 正常方法不变,那么您仍然会得到与现在相同的结果。]

【讨论】:

以上是关于基指针中的派生对象如何调用基函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

python 怎样调用基类函数

派生类指针如何调用基类函数

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

C++如何使用派生类构造函数销毁基类中的对象

基类指针指向派生类对象&派生类指针指向基类对象