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

时间:2017-05-30 12:47:06

标签: c++ inheritance

我尝试在编译器中运行此代码并输出" 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();
}

我没有将打印功能设置为虚拟但它仍具有相同的效果。这有什么理由吗?

1 个答案:

答案 0 :(得分:0)

正如您所做的那样,您只能从类中调用方法 print 。 尝试执行以下操作

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

您将看到数字,不再有。正如有些人所说,那就是名字隐藏。您可以在类 circle 中定义一个新函数,其名称与 figure 中的名称相同。因此,当您在 circle 对象上调用 print 时,可以调用其方法。

然而,如果 print 是一个虚方法,则覆盖该函数。因此,当您在 circle 对象上调用 print 时,只能调用一个函数。