在C ++中如何继承父类的非成员函数,这只是在文件中定义的?

时间:2012-11-28 02:23:25

标签: c++ class inheritance

我有这样的代码:

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的代码,而比较函数实际上是一个复杂的。

4 个答案:

答案 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 ){...}
};