从虚函数调用派生类的成员
我对虚拟功能有点困惑。
让我们假设你有一个虚函数foo()的Base类,然后该函数在Derived类中重写
class Baseclass
{
public:
virtual void foo()
{
//...
}
};
class Derived: public BaseClass
{
private:
int member_val;
public:
Derived( int init )
: member_val( init )
{}
void foo()
{
member_val++;
}
};
和foo使用Derived类的成员值,当我写这个代码
Derived d( 10 );
Base* bPtr = &d;
bPtr->foo();
因为_vptr指向“派生类虚拟表”,并且Derived类虚拟表中的指针指向Derived类的foo(),但是如何找到member_val,导致Base指针不知道,foo()会调用Derived类关于它。 什么“this”从Derived类传递给foo()。 我们将其称为Base *(这是Base类型),但要找到member_val,我们需要Derived *(此派生类型)。 那么它如何在引擎盖下工作?
正确的问题是一半的答案。 就像你的情况一样,你问this
是什么传递给Derived::foo()
,答案是“相同的”。 您创建Derived
类的对象。 它被分配在内存中,如下所示:
Derived:
--------
vptr_t* vptr
int member_val
然后,您将&d
Derived*
到Base*
。 指针发生了什么? 没有。 它只是改变了它的类型,而不是它指向的实际地址。 你可以比其转换回Derived*
使用dynamic_cast<Derived*>()
甚至static_cast<Derived*>
在这种情况下使用两者是绝对安全的。
所以唯一真正的问题是虚拟函数表是如何工作的? 但这是另一个问题,而且你似乎理解它。
请注意:当多个基类一个接一个地位于内存中时,事情对于多继承来说更加复杂。
链接地址: http://www.djcxy.com/p/23327.html