gpt4 book ai didi

c++ - 在不提供定义的情况下覆盖函数有什么意义?

转载 作者:行者123 更新时间:2023-11-28 01:52:57 24 4
gpt4 key购买 nike

我正在阅读一段代码并对以下代码(作为最小示例)编译感到惊讶,并且不得不问在不提供函数体的情况下覆盖函数是否合法?如果是,那么这是否是代码编写者对某些代码逻辑的有意设计?

class Parent {
public:
virtual void func1(){std::cout<< "Parent" << std::endl;};
};


class Child: public Parent {
public:
void func1() override; // override, without function body
};

int main(){
Child c;
// c.func1(); // the code compiles is this line is commented.
}

回复评论

首先感谢 Jerry Coffin 的详细解释。

虽然我觉得有必要在主贴下评论写点什么,但我明白一般函数的定义都是写在cpp文件里的,我确实是在cpp文件里找过定义才发在这里,我对这段代码的主要担心是,这段代码可能是故意这样写的,是的,虽然有链接错误,但这个链接错误可能是编码人员故意暗示不应该调用这个函数。作为以复杂性着称的 C++ 的初级开发人员,我真诚地询问这种想法是否是公认的设计。

最佳答案

编辑:发布的代码在某种程度上是可构建的(使用 gcc,如果添加了 #include 并启用了优化),但下面的解释几乎没有相关性因为在真实 代码中 链接器错误。为了完整起见,我把它留在这里。 (结束编辑)

程序看起来无效,为什么它一直编译?

这个问题有两个答案,一个理论答案(基于语言标准)和一个实践答案(基于编译器和链接器的通常工作方式)。

理论答案如下。该标准没有规定该程序的任何行为。必须定义任何已声明的虚函数,但如果缺少定义,则不需要诊断(3.2 basic.def.odr“一个定义规则”)。因此,实现可以自由地对该程序做任何事情,例如,接受它就好像它没有任何问题一样。

实际的答案是所有对该函数的引用都被优化掉了,所以不需要定义。它是类中的第一个虚函数,因此它控制该类的虚表何时何地发出。由于未定义,因此不会发出虚拟表,但由于未进行虚拟调用,因此永远不会使用 vtable。链接器永远不知道它曾经被需要过。添加和使用不同的虚函数或更改优化级别可能(也可能不会)导致编译器发出对该函数的引用,从而揭示错误。

关于c++ - 在不提供定义的情况下覆盖函数有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com