C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
这句话应该这样理解:
这句话应该这样理解:
当你实现派生类虚函数B : foo时,如果函数体内需要调用基类的虚函数版本时,需要显式使用基类的作用域操作符A::foo(),否则foo()就会在派生类作用域内调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己呀,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了
struct A { virtual void foo(void) { } } struct B: public A { void foo(void) { foo(); // 递归调用自己,即 B::foo() A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己 } }