在C ++中,如果成员函数是虚拟的,何时可以使用静态绑定?

时间:2008-11-05 23:49:04

标签: c++ binding static

在C ++中什么时候虚函数可以使用静态绑定?如果通过指针访问它,直接访问,或从不访问?

3 个答案:

答案 0 :(得分:7)

通过指针或引用调用虚方法时,使用动态绑定。在任何其他时间,使用编译时绑定。例如:

class C;

void Foo(C* a, C& b, C c) {
  a->foo();  // dynamic
  b.foo();  // dynamic
  c.foo();  // static (compile-time)
}

答案 1 :(得分: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;

答案 2 :(得分:2)

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