今天看代码时,看到类似下面的代码,在Sub类InitSub函数中有一句 Base::Init();,以为C++语言可以直接使用类名调用非静态函数?当时有点想不通。
#include <iostream> class Base{ public: void Init() { std::cout<< "Init Base" << std::endl; } }; class Sub : public Base { public: void InitSub() { Base::Init(); // 使用类名调用了非静态函数? } }; int main(){ Sub sub; sub.InitSub(); //Base::Init(); return 0; }
然后我就把 Base::Init(); 直接放到 main 函数中,果然编译不过,提示“ 不能在没有对象的情况下调用成员函数 ‘void Base::Init()’ ”,如下图
所以,C++语言目前时无法用类名直接访问非静态的类成员函数的,那么为什么在 类Sub 中可以使用 Base::Init(); 呢?这里是使用来 Base:: 类名作用域来指明 Init 函数的是Base里面的函数,假设 类Sub 也有 Init() 函数的话,那么运行时就会调用到 类Sub 的,这里显示指明使用 类Base 的 Init() 函数。