无法调用纯抽象基类超载
Unable to call pure abstract base class overload
为什么以下代码不编译,我该怎么办?是否应该在基类中找到纯抽象方法?
#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未解决的外部符号"公共:virtual void __thiscall a :: func1(class std :: basic__string,class std :: allocator>("(?@d@std @@ v?$ selocator@d@2 @@ std @@ z("在funktion"公共:虚拟void __thiscall b :: func1(int("
我正在使用Visual C V140。
它与using A::func1;
一起使用。有什么不同?
B
的func1
实现将其他两个过载从A
隐藏。您可以通过:
B
的接口 struct B
{
using A::func1;
/* ... */
};
在一般中,您可以直接调用基类'过载:
void /*B::*/func1(int) override
{
A::func1("bla"s);
}
这将调用恰好基类的版本,但是,不是是一个覆盖变体,但在给定的情况下,A
的变体是纯虚拟的(即不存在(,因此我们不能在这里应用这种方法。
您与C
有同样的问题 - 这不会编译:
C c;
c.func1(123);
名称查找在分辨率分辨率之前发生,并且查找在找到第一个匹配的范围中停止。
您可以使用using
将所有过载引入派生类的范围:
struct B : A
{
using A::func1; // Make the string overload available trough B's interface.
void func1(int) override
{
func1("bla"s);
}
};
struct C : B
{
using B::func1; // Make the int overload available through C's interface.
void func1(std::string) override
{
}
};
如果您称A::func1(std::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);
}
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- 无法调用纯抽象基类超载
- 如何将基类方法超载作为参数传递到C 中的模板类