gpt4 book ai didi

c++ - 无法调用纯抽象基类重载

转载 作者:太空宇宙 更新时间:2023-11-04 15:29:51 25 4
gpt4 key购买 nike

为什么以下代码无法编译,我该怎么办?它不应该找到基类中声明的纯抽象方法吗?

#include <string>

using namespace std::string_literals;

struct A
{
virtual void func1(int) = 0;
virtual void func1(std::string) = 0;
};

struct B : A
{
void func1(int) override
{
func1("bla"s);
}
};

struct C : B
{
void func1(std::string) override
{
}
};

错误 C2664:“void B::func1(int)”:无法将参数 1 从“std::string”转换为“int”

提前致谢,马丁

编辑链接器错误!

如果有三个文件:

文件测试.h

#include <string>

using namespace std::string_literals;

struct A
{
virtual void func1(int) = 0;
virtual void func1(std::string) = 0;
};

struct B : A
{
void func1(int) override
{
A::func1("bla"s);
}
};

struct C : B
{
void func1(std::string) override;
};

文件测试.cpp

void C::func1(std::string)
{

}

文件main.cpp

int main()
{
C c;

return 0;
}

这导致

错误 LNK2019 未解析的外部符号 ""public: virtual void __thiscall A::func1(class std::basic_string,class std::allocator >)"(?func1@A@@UAEXV?$basic_string@DU?$char_traits @D@std@@V?$allocator@D@2@@std@@@Z)"在 Funktion ""public: virtual void __thiscall B::func1(int)"

我正在使用 Visual C++ v140。

它适用于 using A::func1;。有什么不同?

最佳答案

Bfunc1 的实现隐藏了 A 的其他两个重载。您可以通过以下方式将它们导入回 B 的界面:

struct B
{
using A::func1;
/* ... */
};

一般中,您可以选择直接调用基类的重载:

void /*B::*/func1(int) override
{
A::func1("bla"s);
}

这将准确地调用基类的版本,不过,不是 A 的重写变体,但在给定的情况下的变体是纯虚拟的(即不存在),因此我们不能在这里应用这种方法。

关于c++ - 无法调用纯抽象基类重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57357405/

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