今天看代码时,看到类似下面的代码,在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() 函数。