运行时多态性与编译时间有何不同

时间:2015-09-22 21:05:36

标签: c++ polymorphism runtime virtual override

这是运行时多态性的传统示例

#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()。

2 个答案:

答案 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.

将被称为运行时