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

时间:2015-08-08 10:52:11

标签: c++ oop static abstract-class

这是我的问题的一个最小例子。我有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。 现在回答问题:因为类foo的{​​{1}} - 方法是完全独立的(不使用BB的变量或其他方法),我想要{{1成为静态的。基本上我想与A联系foo

声明foo静态不起作用,因为B::foo()foo实现虚拟方法。你是如何处理这种情况的?

2 个答案:

答案 0 :(得分:3)

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

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

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

这样您也可以使用B::doFoo()

进行调用

答案 1 :(得分:0)

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

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

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

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