即使调用不是通过指针或引用进行的,也可以有人帮助我了解虚拟函数的工作原理吗?
#include <iostream>
class Base {
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
void g() { f(); }
};
class Derived : private Base {
public:
void f() { std::cout << "Derived::f()" << std::endl; }
void h() { g(); }
};
int main(){
Derived d;
d.h(); // prints Derived::f() but if virtual keyword is removed from Base::f() then prints Base::f()
}
d.h()
不会通过指针或引用进行调用,是的。
但是对f()
IS的调用是通过指针-隐式this
指针进行的。
Base::f()
是,virtual
并且被覆盖Derived::f()
,因此在引用对象的一部分时,f()
通过Base*
指针(或Base&
引用)进行的任何调用都将以多态方式分派到。Derived::f()
Base
Derived
Derived::h()
呼唤g()
,这是真的this->g()
,哪里this
是一个Derived*
指针。g()
从对象继承Base
并可以在Derived
对象上调用。g()
不是virtual
,因此Base::g()
被静态调用,其this
指向对象的Base
部分Derived
。Base::g()
呼唤f()
,这是真的this->f()
,哪里this
是一个Base*
指针。f()
是virtual
,因此执行多态调度,并且由于this
指向对象(该对象的Base
一部分)的Derived
指针Derived::f()
被调用而不是Base::f()
。如果您删除virtual
从Base::f()
,然后调用f()
上的Base*
指针(或Base&
引用)将静态调用Base::f()
无条件,不存在多态分派执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句