C++ 实例方法的调用,就好像它是静态方法一样
为什么B::Func可以使用使其看起来像静态方法调用的语法调用A::Func?这不应该因为是实例方法而失败吗C++ 实例方法的调用,就好像它是静态方法一样,c++,C++,为什么B::Func可以使用使其看起来像静态方法调用的语法调用A::Func?这不应该因为是实例方法而失败吗 class A { public: void Func() { printf( "test" ); } }; class B : private A { public: void Func() { A::Func(); // why does it work? (look below in main()) } };
class A {
public:
void Func() {
printf( "test" );
}
};
class B : private A {
public:
void Func() {
A::Func(); // why does it work? (look below in main())
}
};
int main() {
B obj;
obj.Func();
// but we cannot write here, because it's not static
// A::Func();
return 0;
}
这不是“像静态的那样被称为”。这只是用于显式指定要调用哪个成员函数的语法。即使Func
是虚拟的,也可以使用该语法调用基类版本
class B : public A {
public:
void Func() {
this->A::Func(); /* this-> can be omitted */
}
};
int main() {
B obj;
obj.A::Func();
return 0;
}
编辑:obj.A::Func()
在您的情况下实际上是无效的,因为继承是私有的,所以main
看不到A
是B
的基础。我已将B
的继承更改为public,以使答案正确,但如果在friend
函数中,它仍然可以在类外工作。这不是“像静态一样调用”。这只是用于显式指定要调用哪个成员函数的语法。即使Func
是虚拟的,也可以使用该语法调用基类版本
class B : public A {
public:
void Func() {
this->A::Func(); /* this-> can be omitted */
}
};
int main() {
B obj;
obj.A::Func();
return 0;
}
编辑:obj.A::Func()
在您的情况下实际上是无效的,因为继承是私有的,所以main
看不到A
是B
的基础。我已将B
的继承更改为public,以使答案正确,但如果在friend
函数中,它仍然可以在类外工作