C++ 实例方法的调用,就好像它是静态方法一样

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()) } };

为什么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())
    }
};

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
函数中,它仍然可以在类外工作