我有这样的代码:
class A{ // declaration is simplified
virtual void FNC1();
};
bool compare(S s1,S s2){
return s1<s2;
}
void A::FNC1(){
iterator it;
sort(it.begin(),it.end(),compare);
}
class B : public A{
virtual void FNC1();
};
void B:FNC1(){
iterator it;
// do something different
sort(it.begin(),it.end(),compare);
}
所以我使用了B类来继承A类并重写了函数FNC1(),但问题是,如在std :: sort()函数中,第3个变量应该是一个函数,并且这样的函数总是直接宣布。我真的想知道该怎么做才能避免复制和粘贴,并让B直接继承这个功能。我试图将compare()函数作为A的成员函数,它不会编译: sort(it.begin(),it.end(),this-&gt; compare);
我尝试将compare函数包含在一个单独的头文件中,它说我无法声明它。我怎样才能正确地让B继承这个功能?因为,实际上,我有3个类都需要重用A的代码,而比较函数实际上是一个复杂的。
答案 0 :(得分:2)
你的问题是标题中定义了函数compare
,这意味着除了它的签名之外你还有它的主体。如果在两个位置包含标头,编译器将抱怨多个定义。您应该只在标题中包含声明,并在.cpp文件中定义。
这应该进入A的标题,我们称之为a.h
bool compare(S s1,S s2);
这应该进入a.cpp
bool compare(S s1,S s2){
return s1<s2;
}
顺便说一句,只是为了清除术语,你不能继承非成员函数。您可以在任何地方使用任何非成员函数,只要您将其声明和链接包含在其目标文件中即可。
答案 1 :(得分:1)
你可以使比较函数成为基类的static
成员函数,而不是让它独立:
class A{ // declaration is simplified
virtual void FNC1();
public:
static bool compare(const A& s1, const A& s2) {
return ...; // The logic behind your compare function goes here
}
};
您可以使用以下功能:
sort(it.begin(), it.end(), A::compare);
答案 2 :(得分:1)
你走在正确的轨道上。您可以简单地重用compare
函数,您无需修改它或尝试“继承”它或任何此类事物。
以下内容应该编译并运行而不会出错。
#include <algorithm>
#include <vector>
struct S { int i; };
class A{ // declaration is simplified
public:
virtual void FNC1();
};
bool compare(const S& s1,const S& s2){
return s1.i < s2.i;
}
void A::FNC1(){
std::vector<S> v;
std::sort(v.begin(),v.end(),compare);
}
class B : public A{
public:
virtual void FNC1();
};
void B::FNC1(){
std::vector<S> v;
// do something different
std::sort(v.begin(),v.end(),compare);
}
int main () { A a; B b; a.FNC1(); b.FNC1(); }
答案 3 :(得分:0)
如果你比较A的成员它不会编译的原因可能是你没有公开或受保护。默认情况下,类的成员是私有的,派生类不能看到私有成员。
你需要:
class A{ // declaration is simplified
{
virtual void FNC1();
protected:
bool compare( S s1, S s2 ){...}
};