小智 8
通过指针或引用调用虚方法时,将使用动态绑定.在任何其他时间,使用编译时绑定.例如:
class C;
void Foo(C* a, C& b, C c) {
a->foo(); // dynamic
b.foo(); // dynamic
c.foo(); // static (compile-time)
}
Run Code Online (Sandbox Code Playgroud)
如果要调用函数的基类版本,可以通过显式命名基类来实现:
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;Run Code Online (Sandbox Code Playgroud)
仅当对象的类型在编译时完全明确时才能进行静态绑定。我只能想到抽象对象的类型明确的四个地方:在构造函数中、在析构函数中、在本地声明时以及在与动态分配相同的范围内。我不太了解这个标准,所以我无法说出它对这四种可能性的说法(我想说前两种是静态绑定的,第三种可能是静态绑定的,最后一种不是;尽管它可能说它是未定义的或依赖于实现)。除了这些点之外,通过基类指针访问的对象可能指向派生类,并且当前翻译单元无法知道,因此静态绑定是不可能的。可以使用一个实例中指向基类的指针和另一个实例中指向派生类的指针来调用该函数!
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |