5

在 C++ 中,虚函数何时可以使用静态绑定?如果是通过指针访问,直接访问还是从不访问?

4

3 回答 3

9

当通过指针或引用调用虚方法时,使用动态绑定。任何其他时间,都会使用编译时绑定。前任:

class C;

void Foo(C* a, C& b, C c) {
  a->foo();  // dynamic
  b.foo();  // dynamic
  c.foo();  // static (compile-time)
}
于 2008-11-06T00:20:10.243 回答
6

如果要调用函数的基类版本,可以通过显式命名基类来实现:

class Base
{
public:
  virtual ~Base() {}
  virtual void DoIt() { printf("In Base::DoIt()\n"); }
};

class Derived : public Base
{
public:
  virtual void DoIt() { printf("In Derived::DoIt()\n"); }
};

Base *basePtr = new Derived;
basePtr->DoIt();  // Calls Derived::DoIt() through virtual function call
basePtr->Base::DoIt();  // Explicitly calls Base::DoIt() using normal function call
delete basePtr;
于 2008-11-06T00:12:56.827 回答
2

只有当对象的类型在编译时完全明确时,才能进行静态绑定。我只能想到抽象对象的类型明确的四个地方:在构造函数中,在析构函数中,在本地声明时以及在与动态分配相同的范围内时。我不太了解标准,所以我不能说出它对这四种可能性的看法(我会说前两个是静态绑定的,第三个可能是静态绑定的,最后一个不是;虽然它可能说它是未定义的或实现依赖)。除了这些点之外,通过基类指针访问的对象可能指向派生类,并且当前翻译单元无法知道,因此不可能进行静态绑定。

于 2008-11-06T00:08:00.207 回答