关于C++:如何从派生类函数调用父类函数?

How to call a parent class function from derived class function?

如何调用C++派生类中的父函数?例如,我有一个名为parent的类,还有一个名为child的类,它是从父类派生的。内每个类都有一个print函数。在定义孩子的打印函数时,我想调用家长的打印函数。我该怎么做呢?


我将冒风险说明明显的问题:如果函数是在基类中定义的,那么它将自动在派生类中可用(除非它是private)。

如果派生类中有一个具有相同签名的函数,则可以通过添加基类的名称后跟两个冒号base_class::foo(...)来消除它的歧义。您应该注意到,与Java和C语言不同,C++没有"基类"(EDOCX1 8或EDCOX1 3)的关键字,因为C++支持多重继承,这可能导致歧义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class left {
public:
    void foo();
};

class right {
public:
    void foo();
};

class bottom : public left, public right {
public:
    void foo()
    {
        //base::foo();// ambiguous
        left::foo();
        right::foo();

        // and when foo() is not called for 'this':
        bottom b;
        b.left::foo();  // calls b.foo() from 'left'
        b.right::foo();  // call b.foo() from 'right'
    }
};

顺便说一句,不能直接从同一个类派生两次,因为没有办法引用其中一个基类。

1
2
class bottom : public left, public left { // Illegal
};


考虑到名为Parent的父类和名为Child的子类,可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Parent {
public:
    virtual void print(int x);
}

class Child : public Parent {
    void print(int x) override;
}

void Parent::print(int x) {
    // some default behavior
}

void Child::print(int x) {
    // use Parent's print method; implicitly passes 'this' to Parent::print
    Parent::print(x);
}

注意,Parent是类的实际名称,而不是关键字。


如果您的基类被称为Base,而您的函数被称为FooBar(),则可以直接使用Base::FooBar()调用它。

1
2
3
4
5
6
7
8
9
10
void Base::FooBar()
{
   printf("in Base
"
);
}

void ChildOfBase::FooBar()
{
  Base::FooBar();
}

在MSVC中有一个特定于Microsoft的关键字:

MSDN:允许显式声明正在为要重写的函数调用基类实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// deriv_super.cpp
// compile with: /c
struct B1 {
   void mf(int) {}
};

struct B2 {
   void mf(short) {}

   void mf(char) {}
};

struct D : B1, B2 {
   void mf(short) {
      __super::mf(1);   // Calls B1::mf(int)
      __super::mf('s');   // Calls B2::mf(char)
   }
};


如果基类成员函数的访问修饰符是保护的或公共的,则可以从派生类调用基类的成员函数。可以从派生成员函数调用基类非虚拟成员函数和虚拟成员函数。请参考程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
using namespace std;

class Parent
{
  protected:
    virtual void fun(int i)
    {
      cout<<"Parent::fun functionality write here"<<endl;
    }
    void fun1(int i)
    {
      cout<<"Parent::fun1 functionality write here"<<endl;
    }
    void fun2()
    {

      cout<<"Parent::fun3 functionality write here"<<endl;
    }

};

class Child:public Parent
{
  public:
    virtual void fun(int i)
    {
      cout<<"Child::fun partial functionality write here"<<endl;
      Parent::fun(++i);
      Parent::fun2();
    }
    void fun1(int i)
    {
      cout<<"Child::fun1 partial functionality write here"<<endl;
      Parent::fun1(++i);
    }

};
int main()
{
   Child d1;
   d1.fun(1);
   d1.fun1(2);
   return 0;
}

输出:

1
2
3
4
5
6
7
$ g++ base_function_call_from_derived.cpp
$ ./a.out
Child::fun partial functionality write here
Parent::fun functionality write here
Parent::fun3 functionality write here
Child::fun1 partial functionality write here
Parent::fun1 functionality write here

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct a{
 int x;

 struct son{
  a* _parent;
  void test(){
   _parent->x=1; //success
  }
 }_son;

 }_a;

int main(){
 _a._son._parent=&_a;
 _a._son.test();
}

参考示例。