Can static functions and non-virtual methods be overridden? What is Static Polymorphism?
请参阅此函数函数的输出。它显示可以重写静态函数,因为派生类继承函数:
1 | void put(){printf("Static functions in base class");} |
如果我们不重写
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; } |
因为这里
这是一个静态多态性的例子吗?
Can static functions be overridden?
不。
1 2 | struct Base { static void f() {} }; struct Derived : Base { void f() {} }; |
Can non virtual functions be overridden?
不。
1 2 | struct Base { void f() {} }; struct Derived : Base { void 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 |
不可以。静态成员函数和非虚拟成员函数都不能被重写。
对于您来说,如果您将
1 | Static functions in base class |
静态成员函数不能被重写,它们的行为类似于自由函数,不依赖于对象,不隐式使用
现场直播
不,这不是静态多态性的情况:这里没有"覆盖",因为函数调用在编译时被完全解决。
编译器知道
1 2 | base *bp = new derived; bp->put(); // prints"Static functions in base class" |
这就是为什么通过实例指针调用静态函数会产生误导。代码中的调用等价于