如何使用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::printParent::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();// ambiguousleft::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)}
};

如何从派生类函数调用父类函数?相关推荐

  1. c语言 调用父类方法,关于C++:如何从派生类函数调用父类函数?

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

  2. C++(6)——子类调用父类函数实现

    C++(6)--子类调用父类函数实现 在C++中子类对象调用父类函数可通过域操作符(::)来实现,表明所调用函数的作用域. #include<iostream>using namespac ...

  3. python子类如何调用父类方法_python中子类调用父类函数的方法示例

    前言 本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数.下面话不多说了,来一起看看详 ...

  4. 子类super调用父类函数,该函数中调用的函数是父类还子类呢

    如图所示: 子类对象通过super()函数调用父类的run函数,然后直接调用了子类的demo函数,而没有调用父类的函数:猜想通过super调用父类,但self仍然代表是子类本身: 再看一例: 从这里说 ...

  5. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类

    Q1:python函数里的数组如何在函数外调用出来 使用返回值的方法有两种: 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子: l = [1,2,3,4,5] d ...

  6. JavaScript中子类调用父类方法的实现

    一.前言 最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.** ...

  7. C++基础之子类调用父类方法

    结果: 和 结果 效果一样,想要说明一下三点: 1. vs里成员函数的函数体就算只有一条语句也要加花括号,如第7-9行 2. 25行想通过子类调用父类函数fun(int i),通过B1.A::fun( ...

  8. 基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...

    虚函数[1] 问题:还记得第7章的例子吗[2]? 例7-3 类型转换规则举例 #include <iostream> using namespace std; class Base1 { ...

  9. 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...

     上章链接: 22.C++- 继承与组合,protected访问级别 继承方式 继承方式位于定义子类的":"后面,比如: class Line : public Object // ...

最新文章

  1. 2. Add Two Numbers(Leetcode)
  2. html div百分比计算,css计算元素百分比大小
  3. win更改文件默认打开方式
  4. JS中的showModelDialog详解和实例
  5. java关于map用来筛选的用法
  6. atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc 艾提拉总结 attilax总结 1.1. 修改此java文件,让他启动编译,还是不能生成了新的class, 1 1.2. 查
  7. 360linux如何卸载,卸载360安全卫士方法
  8. starway(NOIP模拟测试24)
  9. dm数据库 linux版下载,达梦(DM)数据库Linux部署安装
  10. 产品读书《用户力:需求驱动的产品、运营与商业模式》
  11. 曲线解决问题。HTTP ERROR 403 No valid crumb was included in the request【重装到带CSRF 的版本】
  12. GC.SuppressFinalize()的正确用法
  13. 基于IIC和SPI协议的OLED显示(STM32)
  14. 1054 : 滑动解锁 hihocoder 蓝桥2017模拟
  15. Task3 | HLM | 高收入个体更吝啬吗
  16. dwz php 联动,PHP利用DWZ.CN服务生成短网址
  17. CCCC 天梯赛 PTA ZOJ 题目 L1 L2 L3
  18. 关于报错问题:Canvas: trying to draw too large(180633600bytes) bitmap
  19. 2.BJDCTF(2020第二届)——Misc杂项题
  20. RAM Sequential

热门文章

  1. 关于java mail 发邮件的问题总结(转)
  2. 返回一个二维整数数组最大联通子数组的和(思路)
  3. 插件中对动态表单数据模型进行赋值实现动态表单数据绑定
  4. 《常微分方程教程》习题2.3.6
  5. 简书全站爬取 mysql异步保存
  6. leaflet.toolbar.js
  7. 事务是什么?事务的4个特点(ACID),事务的开启与结束
  8. vue2.0环境搭建
  9. 20145202 《信息安全系统设计基础》第6周学习总结(2)
  10. 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)