关于C++:使虚拟方法实现静态化。

Make the implementation of a virtual method static.

这是我问题的一个很小的例子。我有两个类,一个是抽象类,另一个是派生类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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
BAR
。现在要问的问题是:由于类Bfoo方法是完全独立的(不使用BA的变量或其他方法),我希望foo成为静态的。基本上我想打电话给fooB::foo()

声明foostatic不起作用,因为foo实现了来自A的虚方法。你怎么处理这样的案件?


您只需添加一个新的静态方法,并让foo调用它:

1
2
3
4
5
6
7
8
9
10
11
class B : public A
{
public:
    void foo() {
        doFoo();
    }

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

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


我想,行为不明确,但你可以尝试一下:

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

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

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