静态函数和非虚拟方法可以被覆盖吗?什么是静态多态?
Can static functions and non-virtual methods be overridden? What is Static Polymorphism?
请查看此函数函数的输出。它显示静态函数可以被覆盖,因为派生 class 继承函数:
void put(){printf("Static functions in base class");}
如果我们不覆盖 put()
输出是基础中的静态函数 class
但我们将其覆盖为:
void put(){printf("Static functions are overridden in derived class");}
所以输出是静态函数在派生中被覆盖class
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;
}
因为这里 put()
不是虚函数。那么我们可以覆盖非虚拟函数吗?
这是静态多态的情况吗?
不,这不是静态多态的情况:这里没有"override",因为函数调用是在编译时完全解析的。
编译器知道bp
的类型是derived*
,所以调用静态成员函数derived::put
。如果 bp
的编译时类型是 base*
,base::put
就会被调用 - demo:
base *bp = new derived;
bp->put(); // prints "Static functions in base class"
这就是为什么通过实例指针调用静态函数会产生误导。您代码中的调用等同于 derived::put()
,但您代码的读者必须跟踪类型到声明才能看到。
没有。静态成员函数和非虚拟成员函数都不能被覆盖。
对于您的情况,如果您将 bp
的类型更改为 base*
,您将看到结果将是
Static functions in base class
无法覆盖静态成员函数,它们的行为类似于自由函数,不依赖于对象,不隐式使用 this
指针。调用哪个函数由静态类型决定。
Can static functions be overridden?
没有
struct Base { static void f() {} };
struct Derived : Base { void f() {} };
Base::f
和 Derived::f
是两个不同的函数,它们甚至不共享一个公共接口:正确的不接受任何参数,后者是指向 Derived
的隐藏指针。
Can non virtual functions be overridden?
没有
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
请查看此函数函数的输出。它显示静态函数可以被覆盖,因为派生 class 继承函数:
void put(){printf("Static functions in base class");}
如果我们不覆盖 put()
输出是基础中的静态函数 class
但我们将其覆盖为:
void put(){printf("Static functions are overridden in derived class");}
所以输出是静态函数在派生中被覆盖class 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;
}
因为这里 put()
不是虚函数。那么我们可以覆盖非虚拟函数吗?
这是静态多态的情况吗?
不,这不是静态多态的情况:这里没有"override",因为函数调用是在编译时完全解析的。
编译器知道bp
的类型是derived*
,所以调用静态成员函数derived::put
。如果 bp
的编译时类型是 base*
,base::put
就会被调用 - demo:
base *bp = new derived;
bp->put(); // prints "Static functions in base class"
这就是为什么通过实例指针调用静态函数会产生误导。您代码中的调用等同于 derived::put()
,但您代码的读者必须跟踪类型到声明才能看到。
没有。静态成员函数和非虚拟成员函数都不能被覆盖。
对于您的情况,如果您将 bp
的类型更改为 base*
,您将看到结果将是
Static functions in base class
无法覆盖静态成员函数,它们的行为类似于自由函数,不依赖于对象,不隐式使用 this
指针。调用哪个函数由静态类型决定。
Can static functions be overridden?
没有
struct Base { static void f() {} };
struct Derived : Base { void f() {} };
Base::f
和 Derived::f
是两个不同的函数,它们甚至不共享一个公共接口:正确的不接受任何参数,后者是指向 Derived
的隐藏指针。
Can non virtual functions be overridden?
没有
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