我对虚拟功能有点困惑。
让我们假设你有一个带有虚函数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();
foo()调用Derived类,因为_vptr指向“Derived class virtual table”,而“Derived class virtual table”中的指针指向Derived类的foo(),但是如何找到member_val,导致Base指针没有不知道。什么“this”从Derived类传递给foo()。 我们称它为Base *(这是Base类型),但要找到member_val,我们需要Derived *(这个Derived类型)。 那么它如何在引擎盖下工作?
答案 0 :(得分:0)
正确的问题是答案的一半。与您的情况一样,您询问this
传递给Derived::foo()
的内容,答案是“相同”。您创建了类Derived
的对象。它在内存中分配如下:
Derived:
--------
vptr_t* vptr
int member_val
然后,您将&d
Derived*
投射到Base*
。指针怎么了?没有。它只是改变了它的类型,而不是它指向的实际地址。您可以使用Derived*
甚至dynamic_cast<Derived*>()
将其转换回static_cast<Derived*>
。在这种情况下使用两者都是绝对安全的。
所以唯一真正的问题是虚函数表如何工作?但这是另一个问题,似乎你理解它。
请注意:当多个基类一个接一个地位于内存中时,多重继承会更复杂。