【发布时间】:2019-12-12 21:46:13
【问题描述】:
为什么以下代码无法编译,我该怎么办?不应该找到基类中声明的纯抽象方法吗?
#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
{
}
};
error C2664: 'void B::func1(int)': cannot convert argument 1 from 'std::string' to 'int'
提前致谢, 马丁
编辑链接器错误!
如果有三个文件:
文件 test.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;
};
文件 test.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)" in Funktion ""public: virtual void __thiscall B::func1(int)"
我正在使用 Visual C++ v140。
它适用于using A::func1;。有什么区别?
【问题讨论】:
-
A::func1("bla"s);或using A::func1;在B定义内,因此可以通过B内的名称查找找到这两个重载 -
缺少 B
void func1(std::string) override = 0;
标签: c++ oop inheritance overloading abstract-class