无法调用纯抽象基类超载

Unable to call pure abstract base class overload

本文关键字:基类 超载 抽象 调用      更新时间:2023-10-16

为什么以下代码不编译,我该怎么办?是否应该在基类中找到纯抽象方法?

#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;一起使用。有什么不同?

Bfunc1实现将其他两个过载从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);
}