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