关于c ++:可以覆盖静态函数和非虚方法吗?

Can static functions and non-virtual methods be overridden? What is Static Polymorphism?

请参阅此函数函数的输出。它显示可以重写静态函数,因为派生类继承函数:

1
void put(){printf("Static functions in base class");}

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

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

所以输出是静态函数在派生类中被重写公众:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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;
}

因为这里put()不是一个虚拟函数。那么,我们可以覆盖那些非虚拟的函数吗?

这是一个静态多态性的例子吗?


Can static functions be overridden?

不。

1
2
struct Base { static void f() {} };
struct Derived : Base { void f() {} };

Base::fDerived::f是两个不同的函数,它们甚至不共享一个公共接口:proper不带参数,后者是Derived的隐藏指针。

Can non virtual functions be overridden?

不。

1
2
struct Base { void f() {} };
struct Derived : Base { void f() {} };

当您操作一个对象、对一个对象的引用或指向一个类型为Derived的对象的指针时,Derived::f隐藏Base::f

1
2
3
4
5
6
7
8
9
10
11
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


不可以。静态成员函数和非虚拟成员函数都不能被重写。

对于您来说,如果您将bp的类型更改为base*,您将看到结果

1
Static functions in base class

静态成员函数不能被重写,它们的行为类似于自由函数,不依赖于对象,不隐式使用this指针。将调用哪个函数由静态类型决定。

现场直播


不,这不是静态多态性的情况:这里没有"覆盖",因为函数调用在编译时被完全解决。

编译器知道bp的类型是derived*类型,因此调用静态成员函数derived::put。如果bp的编译时类型是base*,则会调用base::put-demo:

1
2
base *bp = new derived;
bp->put(); // prints"Static functions in base class"

这就是为什么通过实例指针调用静态函数会产生误导。代码中的调用等价于derived::put(),但代码的读卡器必须将类型跟踪到声明才能看到这一点。