【发布时间】:2015-09-22 21:05:36
【问题描述】:
这是运行时多态的一个传统例子
#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()。
【问题讨论】:
-
您的示例中没有编译时多态性(与模板相关)。您通过
show()的虚函数具有常规多态性,并且您在show(int)的派生类中隐藏了基类中的函数。 -
在这个例子中很明显
bp指向一个Derived对象,但是如果指针是一个参数呢?编译器应该看多远才能看到真正分配的类型?这将使 C++ 编译器比现在更慢。所以规则允许它在这种情况下是短视的,当调用非虚函数时。 -
@bku_drytt 有编译时间 poly.. 因为 bp2 用于调用 show(10)。请再次检查代码。它不是功能隐藏
-
@NeilKirk 是这样的吗?如果编译器看到相同类型的对象存储在相同类型的变量中,它会在编译时决定,如果其他类型的 obj 存储在其他变量中,它会将这个决定推迟到运行时???
-
如果是非虚拟的,则根据指针的类型调用函数。如果是虚拟的,则根据对象的实际类型调用函数。
标签: c++ polymorphism runtime virtual overriding