Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使虚拟方法的实现成为静态的。_C++_Oop_Static_Abstract Class - Fatal编程技术网

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这只是一个最小的示例。我的实际类有相当大的构造函数,我不想调用。