调用虚拟函数时的静态成员函数语义

Static member function semantics when calling virtual functions

本文关键字:函数 静态成员 语义 虚拟 调用      更新时间:2023-10-16

假设我们有一个类

class Abstract {
    Abstract( void );
    virtual ~Abstract( void ) = 0;
    virtual void VirtualFunction( void ) = 0;
    static void CallsVirtual( void ) {
        VirtualFunction();
    }
};
class Concrete : public Abstract {
    Concrete( void ) {}
    ~Concrete( void ){}
    virtual void VirtualFunction( void ) {/* Do virtual function-y stuff */}
};
int main( void ) {
    Concrete _concrete;
    Abstract& _abstractReference = _concrete;
    _abstractReference.callsvirtual();
}

当通过指向派生类的基类指针调用基类静态成员函数时,调用哪个虚拟成员函数?

两者都没有。你会得到一个编译器错误。不能从static方法调用非static方法或访问非static成员。

//...
virtual void VirtualFunction( void ) = 0;
static void CallsVirtual( void ) {
    VirtualFunction();   // Nope!
}
//...

使用this指针调用非静态成员函数。this指针隐式传递给每个成员函数
但是,对于static成员函数,根本不传递this指针。因此,不能通过静态成员函数调用非静态成员函数。