C++ 使虚拟方法的实现成为静态的。
这是我的问题的一个最小的例子。我有两个类,一个是抽象的,另一个是派生的C++ 使虚拟方法的实现成为静态的。,c++,oop,static,abstract-class,C++,Oop,Static,Abstract Class,这是我的问题的一个最小的例子。我有两个类,一个是抽象的,另一个是派生的 #include <iostream> class A { public: virtual void foo() = 0; void bar() { foo(); std::cout << "BAR" << std::endl; } }; class B : public A { public: void foo() {
#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();
}
#包括
甲级
{
公众:
虚拟void foo()=0;
空条(){
foo();
std::cout您只需添加一个新的静态方法,并让foo
调用它:
class B : public A
{
public:
void foo() {
doFoo();
}
static void doFoo() {
std::cout << "FOO" << std::endl;
}
};
B类:公共A类
{
公众:
void foo(){
doFoo();
}
静态void doFoo(){
std::cout您只需添加一个新的静态方法,并让foo
调用它:
class B : public A
{
public:
void foo() {
doFoo();
}
static void doFoo() {
std::cout << "FOO" << std::endl;
}
};
B类:公共A类
{
公众:
void foo(){
doFoo();
}
静态void doFoo(){
std::cout您只需添加一个新的静态方法,并让foo
调用它:
class B : public A
{
public:
void foo() {
doFoo();
}
static void doFoo() {
std::cout << "FOO" << std::endl;
}
};
B类:公共A类
{
公众:
void foo(){
doFoo();
}
静态void doFoo(){
std::cout您只需添加一个新的静态方法,并让foo
调用它:
class B : public A
{
public:
void foo() {
doFoo();
}
static void doFoo() {
std::cout << "FOO" << std::endl;
}
};
B类:公共A类
{
公众:
void foo(){
doFoo();
}
静态void doFoo(){
我想可能是未定义的行为,但您可以尝试以下方法:
((B*)nullptr)->B::foo();
通过调用->B::foo()
而不是->foo()
我们跳过了vtable查找,这很好,因为nullptr显然没有指向真正的vtable
这对我有效,但证明不了什么。未定义的行为意味着,如果您运行计算机,这可能会删除计算机上的所有文件。因此,不要真正使用它。我想,未定义的行为,但您可以尝试以下方法:
((B*)nullptr)->B::foo();
通过调用->B::foo()
而不是->foo()
我们跳过了vtable查找,这很好,因为nullptr显然没有指向真正的vtable
这对我有效,但证明不了什么。未定义的行为意味着,如果您运行计算机,这可能会删除计算机上的所有文件。因此,不要真正使用它。我想,未定义的行为,但您可以尝试以下方法:
((B*)nullptr)->B::foo();
通过调用->B::foo()
而不是->foo()
我们跳过了vtable查找,这很好,因为nullptr显然没有指向真正的vtable
这对我有效,但证明不了什么。未定义的行为意味着,如果您运行计算机,这可能会删除计算机上的所有文件。因此,不要真正使用它。我想,未定义的行为,但您可以尝试以下方法:
((B*)nullptr)->B::foo();
通过调用->B::foo()
而不是->foo()
我们跳过了vtable查找,这很好,因为nullptr显然没有指向真正的vtable
这对我来说很有效,但证明不了什么。未定义的行为意味着,如果你运行它,这可能会删除你计算机上的所有文件。因此,不要真正使用它。你希望通过使函数保持静态来获得什么好处?为什么不让它保持原样?另外,请看一看:如果函数真的应该是静态的,为什么它是虚拟的?如果它需要是虚拟的,@dreamzor这只是一个最小的示例。我的实际类有相当大的构造函数,我不想调用。你想通过使函数保持静态来获得什么好处?为什么不让它保持原样?另外,请看一看:如果函数真的应该是静态的,为什么它是虚拟的?如果它需要是虚拟的,@dreamzor这只是一个最小的示例。我的实际类有相当大的构造函数,我不想调用。你想通过使函数保持静态来获得什么好处?为什么不让它保持原样?另外,请看一看:如果函数真的应该是静态的,为什么它是虚拟的?如果它需要是虚拟的,@dreamzor这只是一个最小的示例。我的实际类有相当大的构造函数,我不想调用。你想通过使函数保持静态来获得什么好处?为什么不让它保持原样?另外,请看一看:如果函数真的应该是静态的,为什么它是虚拟的?如果它需要是虚拟的,@dreamzor这只是一个最小的示例。我的实际类有相当大的构造函数,我不想调用。