虚函数不是从接口继承的

时间:2015-11-06 15:56:27

标签: c++ inheritance interface

我有一个带有默认实现的接口类和一个带有header和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头文件传递的?

2 个答案:

答案 0 :(得分:4)

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

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 ++风格思考。

答案 1 :(得分:1)

与始终为虚拟的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 specifier