【问题标题】:Make the implementation of a virtual method static.使虚拟方法的实现成为静态的。
【发布时间】:2015-10-31 18:14:00
【问题描述】:

这是我的问题的一个最小示例。我有 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。 现在问题来了:因为B 类的foo 方法是完全独立的(不使用变量或BA 的其他方法),我希望foo 变为静态。基本上我想用B::foo() 打电话给foo

声明foo static 不起作用,因为foo 实现了来自A 的虚方法。这种情况如何处理?

【问题讨论】:

  • 您希望通过将函数设为静态来获得什么好处?为什么不让它保持原样?另外,看看那个:stackoverflow.com/questions/2721846/…
  • 如果函数真的应该是静态的,为什么它是虚拟的?如果需要虚拟,it clearly cannot be static.
  • @dreamzor 这只是一个小例子。我的实际类有相当大的构造函数,我不想调用。

标签: c++ oop static abstract-class


【解决方案1】:

您可以添加一个新的静态方法并让foo 调用它:

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

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

这样你也可以用B::doFoo()调用它

【讨论】:

    【解决方案2】:

    我猜是未定义的行为,但你可以试试这个:

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

    通过调用-&gt;B::foo() 而不是-&gt;foo(),我们跳过了vtable 查找,这很好,因为nullptr 显然没有指向真实vtable 附近的任何地方。

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

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 1970-01-01
      • 2010-11-17
      • 2013-02-27
      • 2011-02-12
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多