如何从派生类函数调用父类函数?

在C++中,当一个派生类继承自父类,如果父类的函数是受保护的或公共的,派生类可以直接调用。可以使用父类的名称加上两个冒号来消除可能的签名冲突。例如,`父类名::函数名()`,或者在MSVC中,可以使用`__super::函数名()`来调用父类的函数。
摘要由CSDN通过智能技术生成

如何使用C ++从派生类调用父函数? 例如,我有一个名为parent的类,以及一个称为child的类,该类是从parent派生的。 每个类中都有一个print功能。 在定义孩子的打印功能时,我想调用父母的打印功能。 我将如何去做呢?


#1楼

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();
}

参考示例。


#2楼

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

#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;
}

输出:

$ 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

#3楼

给定名为Parent父类和名为Child子类,您可以执行以下操作:

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是类的实际名称,而不是关键字。


#4楼

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

void Base::FooBar()
{
   printf("in Base\n");
}

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

#5楼

我冒着明显的危险:调用该函数,如果它在基类中定义,则该函数在派生类中自动可用(除非它是private )。

如果派生类中有一个具有相同签名的函数,则可以通过添加基类的名称以及两个冒号base_class::foo(...)来消除歧义。 你应该注意到,不像Java和C#,C ++ 具备“基础类”(关键字superbase ,因为C ++的支持), 多重继承 ,这可能导致歧义。

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'
    }
};

顺便说一句,您不能两次直接从同一个类派生,因为将无法在另一个基础类上引用一个基础类。

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

#6楼

使用父范围解析运算符调用父方法。

父类:: method()

class Primate {
public:
    void whatAmI(){
        cout << "I am of Primate order";
    }
};

class Human : public Primate{
public:
    void whatAmI(){
        cout << "I am of Human species";
    }
    void whatIsMyOrder(){
        Primate::whatAmI(); // <-- SCOPE RESOLUTION OPERATOR
    }
};

#7楼

在MSVC中,有一个针对此的Microsoft特定关键字: __super


MSDN:允许您明确声明正在为要重写的功能调用基类实现。

// 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)
   }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值