使虚拟方法的实现静态化。
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 B
的 foo
方法是完全独立的(不使用变量或 B
或 A
的其他方法),我希望 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 附近的任何地方。
这对我有用,但这证明不了什么。未定义的行为意味着如果您 运行 它可能会删除您计算机上的所有文件。所以不要真的用它。
这是我的问题的一个最小示例。我有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 B
的 foo
方法是完全独立的(不使用变量或 B
或 A
的其他方法),我希望 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 附近的任何地方。
这对我有用,但这证明不了什么。未定义的行为意味着如果您 运行 它可能会删除您计算机上的所有文件。所以不要真的用它。