【问题标题】:Calling derived class static method from base class static method从基类静态方法调用派生类静态方法
【发布时间】:2012-05-24 20:38:17
【问题描述】:

我已阅读以下 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 中解决它而不对我的代码进行根本的更改?

【问题讨论】:

    标签: visual-c++ inheritance gcc static


    【解决方案1】:

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

    我所要做的就是将声明与实现分开(它都在一个单独的 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() {}
    

    【讨论】:

    • 我删除了答案,因为我很确定如果没有任何编译器扩展,Q 中的代码将无法编译。我不知道为什么它会在 MSVC 中编译,也许是编译器扩展。跨度>
    • 我认为通常 MSVC 不如 GCC 严格(这不是我第一次遇到在 MSCV 中编译但不在 GCC 中编译的代码)。无论如何谢谢,你的回答让我思考了一下,找到了简单的解决方案......
    猜你喜欢
    • 2015-04-08
    • 2010-10-10
    • 2012-06-25
    • 2011-03-05
    • 2013-04-24
    • 2014-07-31
    • 2013-09-02
    • 2013-01-10
    相关资源
    最近更新 更多