1

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

class A{
public:
    static void bar() {std::cout<<"bar A\n";}
    virtual void foo(){
      //Some A work...
      bar();
    }
};

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

但是现在我想要使用方法 foo()的 C 类,唯一的区别是最后调用 C::bar():

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

但是,在这里我需要制作方法 A::foo 定义的完整副本。我还可以引入像 `virtual void callStaticBar(){bar();} 这样的虚拟虚拟方法,并在 C 类中用相同的文本覆盖它。有没有更优雅的方法来做这样的事情?

4

1 回答 1

0

不。如果C::foo()未定义,调用foo()实例C将真正调用A::foo(); 由于 classA不知道 class C(除了那些使用 vtable 的情况),所以无论原始调用来自实例的事实如何,都无法A::foo()调用。C::bar()C

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

于 2016-11-27T01:55:17.300 回答