使虚拟方法的实现静态化。

Make the implementation of a virtual method static.

这是我的问题的一个最小示例。我有2个classes,一个是抽象的,一个是派生的。

#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。 现在的问题是:因为 class Bfoo 方法是完全独立的(不使用变量或 BA 的其他方法),我希望 foo 变为静态。基本上我想用 B::foo() 调用 foo

声明 foo static 不起作用,因为 foo 实现了 A 的虚拟方法。你是怎么处理这种情况的?

您可以只添加一个新的静态方法并让 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() 我们跳过了 vtable 查找,这很好,因为 nullptr 显然没有指向真实 vtable 附近的任何地方。

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