gpt4 book ai didi

c++ - 在类中声明但未定义的虚拟方法

转载 作者:行者123 更新时间:2023-11-28 06:59:00 26 4
gpt4 key购买 nike

我的目的是找到调用某个函数的所有位置。所以我从它定义了新的类继承,并使该函数不可访问。但是我没有定义方法,我得到了链接错误。

代码如下:

A.hpp:

#ifndef _A_HPP
#define _A_HPP
class _declspec(dllexport) A
{
public:
virtual void f1();
};
class _declspec(dllexport) B: public A
{
private:
void f1();
};
#endif

A.cpp:

#include "A.hpp"
void A::f1(){}

程序.cpp:

#include "A.hpp"

int main(void )
{
A a;
a.f1();
return 0;
}

B::f1() 从未被调用,但我仍然有链接错误。但如果您删除 _declspec(dllexport),它会正常构建。

最佳答案

该函数被类 A 的虚函数表引用。

http://en.wikipedia.org/wiki/Virtual_method_table

你不能有未定义的虚函数(纯虚函数除外)。必须定义它们以便定义虚拟表。

将函数设为私有(private)也是徒劳的,因为简单地调用 (&A).f1() 将调用 B::f1()。


编辑以澄清您的编辑,编译以下内容而不进行优化,

struct Foo { virtual void foo(); };
struct Goo : public Foo { void foo() {} };

int main()
{
Goo f;
return 0;
}

导致链接器错误(使用 GCC),

undefined reference to `typeinfo for Foo'

这是预期的。在您删除导出的情况下,MSVC 可能会作弊。它会看到整个类及其所有用途,但不会生成虚拟表。它优化了它。它知道您没有在外部代码中使用该虚拟表,因此不会理会它。

如果出于完全相同的原因在启用优化的情况下进行编译,我也不会出错。

关于c++ - 在类中声明但未定义的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22777003/

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