Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法调用纯抽象基类重载_C++_Oop_Inheritance_Overloading_Abstract Class - Fatal编程技术网

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);
}