可以覆盖静态函数和非虚拟方法吗?什么是静态多态?

Vin*_*gar 2 c++ polymorphism virtual inheritance static

请参阅此函数 function 的输出。它表明静态函数可以被覆盖,因为派生类继承了函数:

void put(){printf("Static functions in base class");}
Run Code Online (Sandbox Code Playgroud)

如果我们不覆盖put()输出是基类中的静态函数,但我们将其覆盖为:

void put(){printf("Static functions are overridden in derived class");}
Run Code Online (Sandbox Code Playgroud)

所以输出是静态函数在派生类 public 中被覆盖:

#include<iostream>

class base{
public:
static void put(){printf("Static functions in base class");}
};

class derived : public base{
void put(){printf("Static functions are overridden in derived 
class");}    
};

int main(){
derived *bp = new derived;// Static Polymorphism //
bp->put();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于这里put()不是虚函数。所以我们可以覆盖不是虚拟的函数吗?

这是静态多态的情况吗?

YSC*_*YSC 5

静态函数可以被覆盖吗?

不。

struct Base { static void f() {} };
struct Derived : Base { void f() {} };
Run Code Online (Sandbox Code Playgroud)

Base::fDerived::f是两个不同的函数,它们甚至不共享一个公共接口:正确的不接受任何参数,后者是指向 a 的隐藏指针Derived

可以覆盖非虚函数吗?

不。

struct Base { void f() {} };
struct Derived : Base { void f() {} };
Run Code Online (Sandbox Code Playgroud)

Derived::fBase::f当您操作对象、对象引用或指向类型对象的指针时隐藏Derived

Derived d;
Derived& dref = d;
Derived* dptr = &d;
d.f(); // calls Derived::f
dref.f(); // calls Derived::f
dptr->f(); // calls Derived::f

Base& bref = d;
Base* bptr = &d;
bref.f(); // calls Base::f
bptr ->f(); // calls Base::f
Run Code Online (Sandbox Code Playgroud)