派生类中的vtable更新

时间:2015-06-24 13:25:02

标签: c++

让我们假设我们有以下代码。

class b 
{ 
  public:   
  virtual foo(); 
}; 

class c : public b 
{ 
  public: 
  void foo(); 
};  

int main()
{
    C c;
    B* b = &c;
    b->foo(); //I understand that it call foo() in class C
}

我想了解的是在vtable的帮助下?

我理解以下内容

1)b将有一个vtable,其指针指向函数foo()。

2)当编译器遇到类c时,b的vtable将在C中继承。

我的问题

1)b的继承vtable是否会更新c :: foo()的地址?我有这个疑问,因为c :: foo()不是虚函数。主要是我读到的内容指向具有虚拟功能的vtable。

1 个答案:

答案 0 :(得分:0)

foo()的'virtual'是继承的。

为每个foo()添加唯一的cout以确认:

class B
{
public:
  virtual ~B() {}
  virtual void foo() { std::cout << "b::foo()" << std::endl; };
};

class C : public B
{
public:
   virtual ~C() {}
   virtual void foo() { std::cout << "c::foo()" << std::endl; };
};


int t205(void)
{
   C c;
   c.foo();

   B* b = &c;
   b->foo(); 

   b->B::foo();  // b::foo is still accessible

  return(0);
}

输出:

c::foo()
c::foo()
b::foo()