我正在学习多态性,我对这种情况很困惑:假设我有以下C++类:
class A{
...
virtual void Foo(){
Boo();
}
virtual void Boo(){...}
}
class B : public A{
...
void Foo(){
A::Foo();
}
void Boo(){...}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个B实例并调用它的Foo()函数.当该函数调用A :: Foo()时,使用的Boo()方法是A类还是B类?谢谢!
除非您使用类限定函数调用,否则所有方法调用都将被视为相等,即动态分派(如果是虚拟),静态分派(如果不是虚拟).当您完全使用类名限定时,您调用的方法实际上是禁用动态调度机制并引入直接方法调用.
class A{
virtual void Foo(){
Boo(); // will call the final overrider
A::Boo(); // will call A::Boo, regardless of the dynamic type
}
virtual void Boo();
};
class B : public A{
void Foo(){
//Foo(); // Would call the final overrider
// (in this case B: infinite recursion)
A::Foo(); // Will call A::Foo, even if the object is B
}
void Boo();
};
Run Code Online (Sandbox Code Playgroud)
隐式this指针不是此处讨论的重要部分,因为使用显式对象进行调用时会发生完全相同的情况:
B b;
b.Foo(); // will call B::Foo -- note 1
b.A::Foo(); // will call A::Foo
Run Code Online (Sandbox Code Playgroud)
注1:在这个例子中,编译器可以忽略动态调度机制,因为它知道实例的具体类型(它看到定义并且它不是引用/指针)但你可以想象如果b是引用的话会发生同样的情况,或等效地,如果它是一个指针->而不是.
| 归档时间: |
|
| 查看次数: |
8644 次 |
| 最近记录: |