这是我的问题的一个最小例子。我有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}} - 方法是完全独立的(不使用B
或B
的变量或其他方法),我想要{{1成为静态的。基本上我想与A
联系foo
。
声明foo
静态不起作用,因为B::foo()
从foo
实现虚拟方法。你是如何处理这种情况的?
答案 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附近的任何地方。
这对我有用,但事实并非如此。未定义的行为意味着如果您运行它,可能会删除计算机上的所有文件。所以不要真的使用它。