2

我正在学习 C++ 中的虚函数和虚表。但是,我不明白为什么需要动态绑定。编译器是否没有所有信息来确定函数调用是针对派生函数还是基函数,例如这里:

class Base1 { 
   public : virtual void foo() 
            {  cout << " Base foo \n"; } 
};

class Base2 {
   public : virtual void foo() 
           { cout << " Base2 foo \n"; } 
};

class derived : public base1, base 2 {
     public : virtual void foo() 
       { cout << " derived foo \n"; }
}

int main()
{
  derived d;
  Base2 *p = &d;
  p->foo();       // why can't the compiler figure out that this
                  // is a function call to the derived function
                  // foo at compile time?

  return 0;
}
4

1 回答 1

3

为什么不能编译图,这是在编译运行时本身期间对派生函数 foo 的函数调用?

它可以。一些编译器会将调用转换为静态绑定。

还有其他一些情况,编译器必须使用动态绑定

foo()在这个函数中应该调用哪个?

void function( Base* p )
{
  p->foo();
}

无法确定*。必须使用动态绑定。

*编辑:根据我提供的信息。:)

于 2013-02-28T23:18:48.737 回答