虚拟函数未从接口继承

Virtual function not inherited from interface

本文关键字:接口 继承 函数 虚拟      更新时间:2023-10-16

我有一个带有默认实现的接口类和一个带有头和cpp文件的继承类。

List.h

class List {
public:
    virtual int search(const string searchCharacters, bool caseSensitive){return 0;}
}

MyList.h

class MyList : public List {
}

MyList.cpp

int MyList::search(const string searchCharacters, bool caseSensitive)
{
    // Implementation code
}

现在,由于某种原因,我得到了未在"MyList"中声明的成员函数。我有Java背景,但在适应C++的方式方面仍然存在一些问题。为什么定义没有通过MyList头文件进行?

您需要在派生类中声明函数:

class MyList : public List
{
public:
    int search(const string searchCharacters, bool caseSensitive);
}

注意,在C++中,声明和定义是不一样的。在这种情况下,您不能在没有声明的情况下在cpp文件中定义成员函数。如果您不声明(并定义)它,那么派生类将从基类继承它,包括定义。

如果你想让它是多态的,你需要在基类中使它成为虚拟的,如果你要通过基类的指针使用它们,最好同时使析构函数成为虚拟的

class List
{
public:
    virtual int search(const string searchCharacters, bool caseSensitive){return 0;}
    virtual ~List() {}
}

正如@SergeyA所指出的,您也可以将其作为一个纯虚拟函数,使其与java风格的接口更加相似。在这种情况下,你不需要为它提供定义。(你仍然可以提供一个)

class List
{
public:
    virtual int search(const string searchCharacters, bool caseSensitive) = 0;
    virtual ~List() {}
}

最后,C++和Java是完全不同的。如果你想掌握C++,试着用C++风格思考。

与总是虚拟的Java非私有成员方法不同,C++成员函数是而不是虚拟的,除非您在基类中明确声明它为virtual

class List {
public:
    virtual int search(const string searchCharacters, bool caseSensitive) {
        return 0;
    }
};

如果您想在cpp文件中提供重写的实现,还需要提供您在头中重写的成员函数的声明

class MyList : public List {
public:
    int search(const string searchCharacters, bool caseSensitive) override;
};

请注意声明末尾的可选override说明符。