如何保存派生对象的基指针仍指向基函数?
之后a_ptr = &b_obj;
a_ptr->disp();
如果基本函数是虚拟的,我理解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();
}
答案 0 :(得分:5)
基本指针始终指向派生对象的基础部分。它不知道有关Derived对象成员/方法的任何信息。
如果将方法A::disp()
声明为virtual
,则只会在运行时解析它。它可以根据对象A::disp()
指向B::disp()
或a_ptr
。
简单来说,
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()
正常方法,那么您仍然可以获得与现在相同的结果。