使静态虚拟方法的实现。

问题描述:

这是我的问题的最小例子。我有2个类,一个是抽象的,另一个是派生的。使静态虚拟方法的实现。

#include <iostream> 

class A 
{ 
public: 
    virtual void foo() = 0; 
    void bar() { 
     foo(); 
     std::cout << "BAR" << std::endl; 
    } 
}; 

class B : public A 
{ 
public: 
    void foo() { 
     std::cout << "FOO" << std::endl; 
    } 
}; 

int main() 
{ 
    B b; 
    b.bar(); 
} 

代码编译并给出了预期的结果:FOO\nBAR。 现在回答这个问题:因为foo - 类B的方法是完全独立的(不使用变量或其他方法BA),所以我想foo变为静态。基本上我想用B::foo()foo联系。

声明foo静态不起作用,因为foo实现从A虚方法。你如何处理这种情况?

+2

你想通过使函数静态获得什么好处?为什么不把它保持原样呢?另外,请看看:http://*.com/questions/2721846/alternative-to-c-static-virtual-methods?rq=1 – dreamzor

+0

如果函数应该是静态的,为什么它是虚拟的?如果它需要是虚拟的,[它显然不能是静态的](http://*.com/q/1820477/3425536)。 – emlai

+0

@dreamzor这只是一个简单的例子。我的实际类有很大的构造函数,我不想打电话。 – user38034

您可以只需添加一个新的静态方法,并有foo称之为:

class B : public A 
{ 
public: 
    void foo() { 
     doFoo(); 
    } 

    static void doFoo() { 
     std::cout << "FOO" << std::endl; 
    } 
}; 

这种方式,您也将能够与B::doFoo()

未定义行为来称呼它,我想,但你可以试试这个:

((B*)nullptr)->B::foo(); 

通过调用->B::foo()代替->foo()我们跳过虚函数表查找,这是G因为nullptr显然没有指向任何接近真实vtable的地方。

这对我有用,但没有证明。未定义的行为意味着如果您运行它,可能会删除您计算机上的所有文件。所以不要真的使用它。