这是运行时多态性的传统示例
#include<iostream>
using namespace std;
class Base {
public:
virtual void show() { cout<<" In Base \n"; }
void show(int x) { cout<<"over loaded method base";}
};
class Derived: public Base {
public:
void show() { cout<<"In Derived \n"; }
void show(int x) { cout<<"over loaded method derived";}
};
int main(void) {
Base *bp = new Derived;
Base *bp2=new Base;
bp2->show(10); //Case 1: COMPILE-TIME POLYMORPHISM (overloading)
bp->show(); //Case 2: RUN-TIME POLYMORPHISM (overriding)
return 0;
}
//输出:重载方法库 //在派生
中为什么编译器可以在案例1中了解在编译期间调用哪个方法,而不是在案例2中。 在案例2中 - 由于编译器很清楚派生类obj存储在bp中并且show是虚拟的,所以为什么它不能决定在编译时调用哪个show()。
答案 0 :(得分:0)
为什么编译器能够理解在案例1中编译时调用哪个方法而不是案例2
bp2->show(10);
解析为Base::show(int)
,因为它不是virtual
函数。
bp->show(10);
即使Base::show(int)
指向bp
对象,也将解析为Derived
。
如果您希望将调用定向到Derived::show(int)
,则必须在Derived
对象或指针上调用该函数。
Derived *dp = new Derived;
Base *bp = dp;
dp->show(10); // Resolves to Derived::show(int)
bp->show(10); // Resolves to Base::show(int)
至于解析在编译时调用哪个虚拟成员函数,编译器可以在某些情况下执行此操作。这取决于您使用的编译器和优化级别。但是,这种语言无法保证。
在编译时解决虚拟成员函数调用的相关问题:Devirtualizing a non-final method
答案 1 :(得分:0)
这解决了我对NeilKirk和R Sahu的评论的怀疑 -
If it's non-virtual, it calls the function based on the type of the pointer. If it's virtual, it calls the function based on the actual type of object.
将被称为运行时