当前位置: 首页 > 知识库问答 >
问题:

为什么重写非虚函数不会导致编译错误?[副本]

越星晖
2023-03-14

我尝试在编译器中运行此代码,它给出了“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个答案

劳和雅
2023-03-14

当您这样做时,您只从类循环中调用print方法。尝试执行以下操作

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

你会看到这个图形,不再是圆圈。正如一些人所说,这只是名字隐藏。在类circle中定义一个新函数,其名称与图中的函数相同。因此,当在circle对象上调用print时,调用其方法。

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

 类似资料:
  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 根据SQL字符串组合文档,我想在postgresql数据库中执行DELETE语句: 这将导致以下错误: 另一方面,类似的execute工作正常: 我真的看不出有什么区别...

  • 给定下面的代码片段,函数调用有什么不同?什么是函数隐藏?什么是函数覆盖?它们与函数重载有什么关系?两者有什么区别?我在一个地方找不到关于这些的很好的描述,所以我在这里询问,这样我可以整合信息。

  • 我认为的意思是不能大于8位的容量。0B1111_1111是8位。

  • 对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间:

  • 我使用比较器对流进行排序,遇到了一个我不理解的编译器错误。 假设我有以下课程: 我正在创建两个比较器,以按日期对s进行排序,一个按自然顺序,另一个按相反顺序。编译以下代码: 意识到是在上定义的,我想我会尝试以下操作: (对我来说)令人惊讶的是,rev2的代码编译正常,而rev1的代码产生以下错误: 为什么我会收到这些编译器错误?为什么我可以在从构建时有效地规避它们? (如果相关的话,我正在使用Ec