从基类静态方法调用派生类静态方法

时间:2012-05-17 09:17:11

标签: visual-c++ inheritance gcc static

我已阅读以下SO问题:

然而,我对静态方法以及Visual-c ++和gcc之间的区别略有不同。

我有一个类,它捆绑了一些与给定任务相关的静态方法。我想实现每个方法的简单版本,并允许将来更有效的实现。我这样做是通过实现基类中的所有方法,并从派生类调用方法。这样,具有“更新”实现的方法将隐藏“旧”实现。我的问题是,当一个方法g()调用另一个方法f()时,我想验证派生类中的实现是否被调用(如果它存在)。我不能使用虚方法,因为我的方法都是静态的。在visual-c ++中,下面的代码正在执行我刚刚描述的内容,但是gcc将无法编译 - 实际上我很惊讶visual-c ++编译好了。 (我需要我的代码在两者上编译)

struct Base {
    static void f () {}
    static void g () { Derived::f(); } //--- visual-c++ compiles ok; gcc: "'Derived' was not declared in this scope"
};
struct Derived : public Base {
    static void f () {}
};

Derived::g ();

我的问题是,为什么visual-c ++没有抱怨,如何在没有彻底改变代码的情况下在gcc中解决它?

1 个答案:

答案 0 :(得分:0)

好的回答(在我有机会发表评论/接受之前删除)让我明白解决方案有多简单(换句话说,我的问题多么愚蠢:))

我所要做的就是将声明与实现分开(它只是在单个h文件中 - 编码错误,我知道,这是一个永久的'临时'解决方案)

struct Base {
    static void f ();
    static void g ();
};

struct Derived : public Base {
    static void f();
};

int main() {
        Derived::g ();
        return 0;
}

void Base::f () {}

void Base::g () { Derived::f(); } 

void Derived::f() {}