为什么覆盖非虚拟函数不会导致编译错误

Why does overriding a non virtual function not cause compilation error?

本文关键字:编译 错误 覆盖 虚拟 函数 为什么      更新时间:2023-10-16

我尝试在编译器中运行此代码,并给出了" Circle"的输出:

#include <iostream>
using namespace std;
class figure{
    public:
    void print(){cout << "figure";};
};
class circle: public figure{
    public:
    void print(){cout << "circle";};
};
int main() {
    circle c;
    c.print();
}

我没有将打印功能设置为虚拟的,但它仍然具有相同的效果。有原因吗?

与您一样,您仅调用类 circle 的方法 print 。尝试做以下

int main() {
    figure* c = new circle();
    c->print();
    delete c;
}

您会看到 figue ,不再 circle 。正如某些人所说的那样,这只是藏匿处的名字。您在类 circle 中定义了一个新功能,其名称与 figie 中的名称相同。因此,当您在A circle 对象上调用 print 时,请调用其方法。

尽管如此,如果 print 是一种虚拟方法,则覆盖函数。因此,当您在 circle 对象上调用 print 时,只有一个函数可以称为。