C ++:从全局函数调用继承的成员函数

时间:2015-04-06 11:07:48

标签: c++ inheritance

虽然我在C编程多年,但我目前正在开发一个C ++项目,我需要一些帮助。我有以下情况,我附上最简单的例子,我可以想出来。理想情况下,A类和B类不应更改。它们属于一个模拟框架,不应该使用特定于我的项目的代码来膨胀。

B类派生自A类,然后从B派生出许多类(D1,D2,最多D11)。所有这些派生类中的函数finishSpecific()都有大量的公共代码,我想把全局函数finishSpecificCommon()放进去。在这个函数中,我需要调用trace(),它将一些信息记录到跟踪文件中(为了简单起见,我在示例中更改了它的行为)。但是,我似乎无法弄清楚如何调用trace()。当前代码给出了folloawing错误:

example.cc: In function ‘void finishSpecificCommon()’:
example.cc:22:8: error: ‘trace’ was not declared in this scope
  trace() << "Hello world!";

我当然研究了类似的答案,但在我的案例中存在一些阻碍我应用它们的差异。首先,trace()受到保护而不是公开的,就像我发现的所有例子一样。其次,有多个派生类(D1,D2,...,D11)而不是单个派生类,并且必须在所有派生类中调用finishSpecificCommon()。

我尝试过使用朋友失败了。此外,我尝试将一个对象作为参数传递给finishSpecificCommon(),通过它我可以调用trace(),但是卡在了应该传递的对象的类型中。

如果您有任何建议可以让我解开,我将不胜感激。

以下是示例代码。用gcc -c example.cc编译它

example.h文件:

#include <iostream>

class A {

 protected:
    virtual void finishSpecific() { };
    std::ostream & trace();
};

class B: public A {

    virtual void finishSpecific() {}
};

namespace D1_NS {

    class D1: public B {
    protected:
        void finishSpecific();
    };

}

namespace D2_NS {

    class D2: public B {
    protected:
        void finishSpecific();
    };

}

void finishSpecificCommon(void);

example.cc:

#include "example.h"

std::ostream & A::trace()
{
    std::ostream & output = std::cout;

    return output;
}

void D1_NS::D1::finishSpecific()
{
    finishSpecificCommon();
}

void D2_NS::D2::finishSpecific()
{
    finishSpecificCommon();
}

void finishSpecificCommon()
{
    trace() << "Hello world!";
}

1 个答案:

答案 0 :(得分:0)

在您的示例中,trace是A类的成员。因此,您必须在类的实例中调用它或将其定义为static。请注意,您在受保护的部分中定义了它,因此除非将其定义为该类的friend,否则无法从外部函数调用它。

我想你应该将finishSpecificCommon()添加到A类,这样你就可以在任何派生自A的类中使用它。

class A {

 protected:
    void finishSpecificCommon();
    virtual void finishSpecific() { };
    std::ostream & trace();
};

...    

void D2_NS::D2::finishSpecific(){
    finishSpecificCommon();
    trace() << "Hello world!";
}