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

时间:2016-03-18 10:05:06

标签: c++ inheritance static polymorphism virtual

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

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

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

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

因此输出是在派生类中重写静态函数 公共:

#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()不是虚函数。那么我们可以覆盖非虚拟的函数吗?

这是静态多态的情况吗?

3 个答案:

答案 0 :(得分:3)

  

是否可以覆盖静态函数?

没有

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

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

  

是否可以覆盖非虚拟功能?

没有

struct Base { void f() {} };
struct Derived : Base { void f() {} };
当您操作对象,对象的引用或指向Derived::f类型的对象的指针时,

Base::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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

没有。静态成员函数和非虚拟成员函数都不能被覆盖。

对于您的情况,如果您将bp的类型更改为base*,您将会看到结果

Static functions in base class

静态成员函数无法被覆盖,它们像自由函数一样行为,不依赖于对象,不会隐式使用this指针。将调用哪个函数由静态类型决定。

LIVE