C++ 无法调用纯抽象基类重载
为什么下面的代码没有编译,我能做些什么?它不应该找到基类中声明的纯抽象方法吗C++ 无法调用纯抽象基类重载,c++,oop,inheritance,overloading,abstract-class,C++,Oop,Inheritance,Overloading,Abstract Class,为什么下面的代码没有编译,我能做些什么?它不应该找到基类中声明的纯抽象方法吗 #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 {
#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
{
}
};
文件test.cpp
void C::func1(std::string)
{
}
文件main.cpp
int main()
{
C c;
return 0;
}
这导致了
错误LNK2019未解析的外部符号公共:虚拟无效\uuu thiscall A::func1class std::basic\u字符串,类std::allocator>?func1@A@@UAEXV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@函数公共中的2@@@std@@@Z:虚拟无效\u此调用B::func1int
我使用Visual C++ V140. < /P> 它与使用::func1;配合使用;。有什么区别
B的func1实现对A隐藏了其他两个重载。您可以通过以下方式将它们导入B的接口:struct B
{
using A::func1;
/* ... */
};
通常,您也可以直接调用基类的重载:
void /*B::*/func1(int) override
{
A::func1("bla"s);
}
这将准确地调用基类的版本,虽然不是的重写变体,但在给定的情况下,A的变体是纯虚拟i。E不存在,因此我们无法在此应用此方法。您对C有相同的问题-这将无法编译:
C c;
c.func1(123);
名称查找发生在重载解析之前,查找在找到第一个匹配项的范围内停止
可以使用以下命令将所有重载引入派生类的作用域:
如果调用::func1std::string并为其提供实现,代码也会编译
struct A
{
virtual void func1(int) = 0;
virtual void func1(std::string) = 0;
};
// Yes, you can provide an implementation for a pure virtual function.
void A::func1(std::string) {}
struct B : A
{
void func1(int) override
{
A::func1("bla"s);
}
};
但这段代码——您可能希望使用它——不会:
void foo(B* b)
{
b->func1("blargh"s);
}
A::func1blas;或者使用::func1;在B定义的内部,因此可以通过BB内部的名称查找找到这两个重载缺少void func1std::string override=0;使用::func1是可行的。在B中再次声明抽象方法也很有效。但我得到了一个链接器错误与::func1blas。对于这个小例子,情况并非如此。但在我的真实代码中。我假设这与某些函数是内联函数而其他函数不是内联函数有关。我已经添加了一些有关链接器错误的信息。@MartinFehrs我的错误:A::func1是纯虚拟函数,因此我们无法直接调用它。。。调整了答案。我已经添加了一些关于链接器错误的信息。@MartinFehrs我已经对如何消除链接器错误做了同样的操作。
struct A
{
virtual void func1(int) = 0;
virtual void func1(std::string) = 0;
};
// Yes, you can provide an implementation for a pure virtual function.
void A::func1(std::string) {}
struct B : A
{
void func1(int) override
{
A::func1("bla"s);
}
};
void foo(B* b)
{
b->func1("blargh"s);
}