Advertisement

C++中子类与父类成员函数的覆盖与隐藏详解实例

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文深入解析了C++编程语言中关于继承机制的关键概念——子类对父类成员函数的覆盖与隐藏。通过具体代码示例,详细阐述了如何正确使用这些特性来实现功能扩展和重用,并探讨了常见的陷阱和最佳实践技巧,帮助开发者避免常见错误,有效提升程序设计质量。 C++子类父类成员函数的覆盖与隐藏实例详解 ### 函数的覆盖 **条件:** (1)基类中的被覆盖函数必须声明为虚函数(使用`virtual`关键字) (2)需要在派生类和基类中分别定义这两个同名且参数列表相同的函数 (3)两个函数的名字及参数列表完全一致。 ### 函数的隐藏 **条件:** (1)子类与父类中的方法具有相同名称,但它们可以有不同的参数类型或数量。 通过下面的例子来理解这些概念: ```cpp #include using namespace std; class CBase{ public: virtual void xfn(int i){ cout << CBase::xfn() called << endl; } }; class CDerived : public CBase { public: void xfn(int i) override { // 注意这里使用了override关键字,表明这个函数覆盖基类的同名虚函数 cout << CDerived::xfn() called << endl; } void hideFunction(CBase* p, int j){ CBase::xfn(j); // 调用父类的方法 xfn(p->xfn(10)); // 这里调用了派生类中隐藏的函数,而不是基类中的那个。 } }; int main(){ CDerived d; d.hideFunction(&d, 2); } ``` 以上代码展示了如何在C++中实现和理解虚方法覆盖与重载(或称为“隐藏”)的概念。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • C++
    优质
    本文深入解析了C++编程语言中关于继承机制的关键概念——子类对父类成员函数的覆盖与隐藏。通过具体代码示例,详细阐述了如何正确使用这些特性来实现功能扩展和重用,并探讨了常见的陷阱和最佳实践技巧,帮助开发者避免常见错误,有效提升程序设计质量。 C++子类父类成员函数的覆盖与隐藏实例详解 ### 函数的覆盖 **条件:** (1)基类中的被覆盖函数必须声明为虚函数(使用`virtual`关键字) (2)需要在派生类和基类中分别定义这两个同名且参数列表相同的函数 (3)两个函数的名字及参数列表完全一致。 ### 函数的隐藏 **条件:** (1)子类与父类中的方法具有相同名称,但它们可以有不同的参数类型或数量。 通过下面的例子来理解这些概念: ```cpp #include using namespace std; class CBase{ public: virtual void xfn(int i){ cout << CBase::xfn() called << endl; } }; class CDerived : public CBase { public: void xfn(int i) override { // 注意这里使用了override关键字,表明这个函数覆盖基类的同名虚函数 cout << CDerived::xfn() called << endl; } void hideFunction(CBase* p, int j){ CBase::xfn(j); // 调用父类的方法 xfn(p->xfn(10)); // 这里调用了派生类中隐藏的函数,而不是基类中的那个。 } }; int main(){ CDerived d; d.hideFunction(&d, 2); } ``` 以上代码展示了如何在C++中实现和理解虚方法覆盖与重载(或称为“隐藏”)的概念。
  • C++重载、区别分析
    优质
    本文详细解析了C++编程语言中的函数和操作符重载、方法覆盖以及名称隐藏的概念,并通过实际代码示例进行说明。适合深入理解面向对象特性的开发者阅读。 本段落主要介绍了C++中重载、重写(覆盖)和隐藏的区别,这是C++面向对象程序设计中的重要概念。需要了解这些内容的朋友可以参考相关资料。
  • C++获取指针代码
    优质
    本文详细讲解了在C++中如何获取和使用类成员函数的函数指针,并提供了具体的示例代码,帮助读者深入理解这一技术的应用。 本段落主要介绍了C++获取类的成员函数的函数指针的相关资料及实例代码,供需要的朋友参考。
  • C++构造析构顺序
    优质
    本文详细解析了C++编程语言中对象初始化和销毁时,类成员构造与析构函数的调用顺序,并通过示例代码进行说明。 在C++编程语言中,构造函数和析构函数是类的重要组成部分,它们分别负责对象的初始化和清理工作。本段落将详细讲解C++类成员构造函数和析构函数的执行顺序,帮助你理解这两个关键概念。 首先回顾一下构造函数的规则: 1. **基类构造函数**:如果一个类是另一个类的派生类,在创建派生类对象时会先调用基类默认构造函数。这是为了确保基类部分能够正确初始化。 2. **非静态数据成员**:接着,按照在类中声明的顺序,依次对各个非静态数据成员进行初始化。每个数据成员都会调用其对应的构造函数。 3. **派生类构造函数**:执行派生类自身的构造函数。这一步通常用于完成派生类特定的初始化工作。 通过一个例子来说明这一点: ```cpp class c { public: c() { printf(cn); } }; class b { public: b() { printf(bn); } private: c C; }; class a : public b { public: a() { printf(an); } }; ``` 在这个例子中,`a`继承自`b`,而`b`有一个类型为c的成员变量C。当创建对象A时,构造顺序如下: 1. 调用基类B的构造函数(打印bn)。 2. 初始化B中的成员变量C(打印cn)。 3. 执行派生类a自身的构造函数(打印an)。 接下来我们看析构函数的规则:它遵循与构造函数相反的顺序: 1. **派生类析构函数**:首先调用派生类的析构函数,用于清理派生类自己的资源。 2. **销毁数据成员**:按照逆序销毁非静态数据成员。即先销毁最近声明的数据成员。 3. **基类析构函数**:最后调用基类的析构函数,清理基类的资源。 举个例子: ```cpp class c { public: ~c() { printf(cn); } }; class b { public: ~b() { printf(bn); } private: c C; }; class a : public b { protected: c C1; // 假设还有其他成员变量,这里仅列出一个 public: ~a() { printf(an); } }; ``` 当主函数结束时,对象A的生命周期终止。析构顺序如下: 1. 调用派生类a的析构函数(打印an)。 2. 销毁成员变量C1和其它声明在a中的数据成员(打印cn)。 3. 最后调用基类b的析构函数(打印bn),清理资源。 通过这两个例子,我们可以清楚地看到构造和析构过程中对象成员的初始化与清理顺序。理解这个顺序对于编写复杂的C++程序至关重要,因为它有助于避免内存泄漏和其他资源管理错误。在实际编程中,尤其是处理含有指针或者动态分配内存的成员时,掌握这些规则尤其重要。因此,了解并熟练使用它们对成为一个专业的C++程序员来说是必不可少的。
  • Python 访问方法
    优质
    本文介绍在Python中如何使子类能够访问并利用其父类中的类成员方法,涵盖相关概念和具体代码示例。 大家好, 今天在编写代码的过程中遇到了一个问题。我有以下类用于存放程序配置(实际上用作命名空间,并且觉得这样继承起来会更方便): ```python import os class Config: BASE_DIR = tmp class TestConfig(Config): DATA_DIR = os.path.join(Config.BASE_DIR, data) ``` 我在子类中想要访问父类的类成员变量,而这两个类都只有类成员变量。目前我直接引用父类的名字来实现这一点,感觉这种方法不够灵活。我想找到一种方法可以让子类能够更方便地访问到父类中的这些成员。 在网上查找了一些资料后,发现有几种可能的方法可以解决这个问题。
  • C++矩形(含
    优质
    本矩形类使用C++编写,包含表示长度和宽度的数据成员以及计算面积、周长等操作的函数成员。 设计一个程序,定义一个矩形类,该类应包含数据成员和函数成员。
  • 窗口调用窗口
    优质
    本示例展示了如何在C++编程环境中,从子窗口对象内部有效地访问和调用其父窗口类中的成员函数。通过这种方法可以实现更灵活、模块化的代码设计,并保持良好的封装性。此教程适合中级程序员参考学习。 在子窗口中调用父窗口的成员函数有两种方法: 1. 使用 `FindWindow(类名(可以是派生类), 窗口标题)` 或者 `GetParent()` 函数,这两种方式都可以返回父窗口句柄,并可以直接使用其成员函数。但是这种方法只能调用 `CWnd` 类中的成员函数,而不能直接访问自己创建的派生类中的函数。 2. 在子窗口初始化时添加一个指向父窗口指针的参数,在子窗口类中通过全局变量保存该指针。例如:假设父窗口类为 CMyDlg(其基类是 CDialog),子窗口类为 CMySon(其基类也是 CDialog)。在 `CMyDlg::OnInitDialog()` 中初始化一个指向子窗口对象的成员,如 `m_myson = new CMySon(this);` (其中 m_myson 是定义在父窗口中的成员变量)。然后,在 MySon.cpp 文件中声明全局变量 `CMyDlg *parent;`(同时需要在 MySon.h 头文件中包含 MyDlg.h),最后在子类构造函数里设置 parent 指针,如 `parent = (CMyDlg*) pParent;`。完成这些步骤后,现在你就可以从子窗口调用父窗口的任何成员函数了!
  • Java异常及Exception
    优质
    本篇文章详细解析了Java中的异常处理机制、Exception类及其子类的应用,并通过具体实例进行深入浅出地讲解。 接下来为大家介绍一篇关于Java异常 Exception类及其子类的实例讲解文章。我觉得这篇文章非常不错,现在分享给大家作为参考。希望大家能跟随我一起深入了解相关知识。
  • Python调用方法演示
    优质
    本实例详细讲解了在Python编程语言中,如何实现和使用继承机制来让子类访问并执行其父类的方法。通过具体代码展示,帮助理解多态性和面向对象的关键概念。 本段落主要介绍了Python子类调用父类函数的相关内容。在Python中,子类中的`__init__()`方法会覆盖父类的同名方法,在某些情况下需要在子类里调用父类的方法。下面通过一个具体的例子来详细讲解如何实现这一点。 例如,在以下代码示例中,需要在特定位置调用父类的方法: ```python # -*- coding:utf-8 -*- class Student: def __init__(self, name): self.name = name def ps(self): print(fI am {self.name}) class Score(Student): # 在这里需要调用父类的构造函数或其他方法。 ``` 接下来,我们将详细介绍如何在子类中正确地调用这些父类的方法。
  • C++使用作为回调
    优质
    本文介绍了如何在C++程序设计中将类的成员函数用作回调函数的方法和技巧,帮助读者解决编程中的实际问题。 在C++编程语言中,将类的成员函数作为回调函数使用是一种常见的技术。这种方法允许对象的方法响应特定事件或操作。实现这一功能的关键在于理解如何正确传递成员函数指针,并确保它们能在适当的上下文中被调用。 通常情况下,在非静态成员函数用作回调时需要提供一个指向该对象实例(即this指针)的引用,以便在回调执行期间访问类的数据成员和方法。为了简化这个过程,可以使用std::bind或lambda表达式来创建适配器函数,这样就不必手动处理传入参数。 此外,在现代C++中还可以利用function、mem_fn等工具库进一步改进代码结构和可读性。这些技术不仅提高了程序的灵活性和复用率,也使得异步编程模式变得更加直观易懂。 总之,掌握如何在回调机制中使用类成员函数对于开发高效且模块化的软件系统至关重要。