C 从虚拟函数调用静态函数

c++ calling static function from virtual function

本文关键字:静态函数 函数调用 虚拟      更新时间:2023-10-16

我有虚拟方法,可以调用适当类的静态方法:

class A{
public:
    static void bar() {std::cout<<"bar An";}
    virtual void foo(){
      //Some A work...
      bar();
    }
};
class B : public A{
public:
    static void bar() {std::cout<<"bar Bn";}
    virtual void foo() override {
       //Some B work...
       bar(); //prints bar B, as intended.
   }
};

,但是现在我想使用class c,使用method foo(),唯一的调用c :: bar()的差异:

class C : public A {
public:
    static void bar() override {std::cout<<"bar Cn";}
    virtual void foo(){
      //Some **A** work...
      bar(); //I want to print "bar C" here
    }
}

但是,在这里我需要完整副本A :: foo定义。我还可以介绍虚拟方法,例如`virtual void callstaticbar(){bar();},并用相同的文本将其覆盖。是否有更多优雅的方法来做这种事情?

no。如果未定义C::foo(),则在C实例上调用foo()将真正调用A::foo();由于A类不知道C类(除了那些带有VTable的案例),因此A::foo()无法调用C::bar(),而不管原始呼叫来自C实例。

您需要使用虚拟方法的方法或告诉我们更多有关您要实现的目标的信息,因为它们可能是在特定情况下的更好解决方案。