基指针中的派生对象如何调用基函数?
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++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???