首页 文章

我可以调用基类's virtual function if I' m覆盖它吗?

提问于
浏览
295

假设我有类 FooBar 设置如下:

class Foo
{
public:
    int x;

    virtual void printStuff()
    {
        std::cout << x << std::endl;
    }
};

class Bar : public Foo
{
public:
    int y;

    void printStuff()
    {
        // I would like to call Foo.printStuff() here...
        std::cout << y << std::endl;
    }
};

正如在代码中注释的那样,我'd like to be able to call the base class'的函数是'm overriding. In Java there'的 super.funcname() 语法 . 这可能在C?

7 回答

  • 0

    如果要从派生类中调用基类函数,只需在提及基类名称(如 Foo::printStuff() )的情况下调用重写函数 .

    代码在这里

    #include <iostream>
    using namespace std;
    
    class Foo
    {
    public:
        int x;
    
        virtual void printStuff()
        {
             cout<<"Base Foo printStuff called"<<endl;
        }
    };
    
    class Bar : public Foo
    {
    public:
        int y;
    
        void printStuff()
        {
            cout<<"derived Bar printStuff called"<<endl;
            Foo::printStuff();/////also called the base class method
        }
    };
    
    int main()
    {
        Bar *b=new Bar;
        b->printStuff();
    }
    

    同样,您可以在运行时确定使用该类的对象(派生或基础)调用哪个函数 . 但这要求您在基类中的函数必须标记为虚拟 .

    代码如下

    #include <iostream>
    using namespace std;
    
    class Foo
    {
    public:
        int x;
    
        virtual void printStuff()
        {
             cout<<"Base Foo printStuff called"<<endl;
        }
    };
    
    class Bar : public Foo
    {
    public:
        int y;
    
        void printStuff()
        {
            cout<<"derived Bar printStuff called"<<endl;
        }
    };
    
    int main()
    {
    
        Foo *foo=new Foo;
        foo->printStuff();/////this call the base function
        foo=new Bar;
        foo->printStuff();
    }
    
  • 0

    C语法是这样的:

    class Bar : public Foo {
      // ...
    
      void printStuff() {
        Foo::printStuff(); // calls base class' function
      }
    };
    
  • 6

    是,

    class Bar : public Foo
    {
        ...
    
        void printStuff()
        {
            Foo::printStuff();
        }
    };
    

    它与Java中的 super 相同,只是它允许在具有多个继承时从不同的基础调用实现 .

    class Foo {
    public:
        virtual void foo() {
            ...
        }
    };
    
    class Baz {
    public:
        virtual void foo() {
            ...
        }
    };
    
    class Bar : public Foo, public Baz {
    public:
        virtual void foo() {
            // Choose one, or even call both if you need to.
            Foo::foo();
            Baz::foo();
        }
    };
    
  • 108

    有时你需要调用基类的实现,当你不在派生函数中时...它仍然有效:

    struct Base
    {
        virtual int Foo()
        {
            return -1;
        }
    };
    
    struct Derived : public Base
    {
        virtual int Foo()
        {
            return -2;
        }
    };
    
    int main(int argc, char* argv[])
    {
        Base *x = new Derived;
    
        ASSERT(-2 == x->Foo());
    
        //syntax is trippy but it works
        ASSERT(-1 == x->Base::Foo());
    
        return 0;
    }
    
  • 63

    为了防止你为你班上的很多功能做到这一点:

    class Foo {
    public:
      virtual void f1() {
        // ...
      }
      virtual void f2() {
        // ...
      }
      //...
    };
    
    class Bar : public Foo {
    private:
      typedef Foo super;
    public:
      void f1() {
        super::f1();
      }
    };
    

    如果要重命名Foo,这可能会节省一些写入 .

  • 390

    检查一下......

    #include <stdio.h>
    
    class Base {
    public:
       virtual void gogo(int a) { printf(" Base :: gogo (int) \n"); };    
       virtual void gogo1(int a) { printf(" Base :: gogo1 (int) \n"); };
       void gogo2(int a) { printf(" Base :: gogo2 (int) \n"); };    
       void gogo3(int a) { printf(" Base :: gogo3 (int) \n"); };
    };
    
    class Derived : protected Base {
    public:
       virtual void gogo(int a) { printf(" Derived :: gogo (int) \n"); };
       void gogo1(int a) { printf(" Derived :: gogo1 (int) \n"); };
       virtual void gogo2(int a) { printf(" Derived :: gogo2 (int) \n"); };
       void gogo3(int a) { printf(" Derived :: gogo3 (int) \n"); };       
    };
    
    int main() {
       std::cout << "Derived" << std::endl;
       auto obj = new Derived ;
       obj->gogo(7);
       obj->gogo1(7);
       obj->gogo2(7);
       obj->gogo3(7);
       std::cout << "Base" << std::endl;
       auto base = (Base*)obj;
       base->gogo(7);
       base->gogo1(7);
       base->gogo2(7);
       base->gogo3(7);
    
       std::string s;
       std::cout << "press any key to exit" << std::endl;
       std::cin >> s;
       return 0;
    }
    

    产量

    Derived
     Derived :: gogo (int)
     Derived :: gogo1 (int)
     Derived :: gogo2 (int)
     Derived :: gogo3 (int)
    Base
     Derived :: gogo (int)
     Derived :: gogo1 (int)
     Base :: gogo2 (int)
     Base :: gogo3 (int)
    press any key to exit
    

    最好的方法是使用 base::function ,如@sth

  • 27

    是的,你可以打电话给它 . 用于在子类中调用父类函数的C语法是

    class child: public parent {
      // ...
    
      void methodName() {
        parent::methodName(); // calls Parent class' function
      }
    };
    

    阅读有关函数overriding的更多信息 .

相关问题