从虚函数中调用Derived类的成员

时间:2013-02-12 06:19:33

标签: c++ virtual-functions

我对虚拟功能有点困惑。

让我们假设你有一个带有虚函数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类型)。 那么它如何在引擎盖下工作?

1 个答案:

答案 0 :(得分:0)

正确的问题是答案的一半。与您的情况一样,您询问this传递给Derived::foo()的内容,答案是“相同”。您创建了类Derived的对象。它在内存中分配如下:

Derived:
--------
vptr_t* vptr
int member_val

然后,您将&d Derived*投射到Base*。指针怎么了?没有。它只是改变了它的类型,而不是它指向的实际地址。您可以使用Derived*甚至dynamic_cast<Derived*>()将其转换回static_cast<Derived*>。在这种情况下使用两者都是绝对安全的。

所以唯一真正的问题是虚函数表如何工作?但这是另一个问题,似乎你理解它。

请注意:当多个基类一个接一个地位于内存中时,多重继承会更复杂。