【C++】继承和多态、public、private、protected、重写

news/2024/11/8 14:51:12/

区分继承与多态、辨别public、protected、private

  • 继承与多态的概念
  • 继承与多态的区别与联系
    • 区别:
    • 联系:
    • 示例
    • 结果:
  • 继承和访问的权限
    • 说明
    • 示例:
    • 结果
  • 结论

继承与多态的概念

	面向对象三大原则:封装、继承、多态。
  • 继承是一种机制,通过它一个类可以从另一个类继承属性和方法。派生类(子类)继承基类(父类)的成员函数和数据成员,并且可以在其基础上扩展自己的成员函数和数据成员。C++支持多重继承,即一个派生类可以同时从多个基类中继承。

  • 多态是指同一种操作作用于不同的对象上面,可以有不同的解释,产生不同的执行结果。在C++中,实现多态需要借助虚函数。虚函数是在基类中声明的函数,派生类可以对其进行重写,从而实现不同的功能。当通过指向基类的指针或引用调用虚函数时,程序会根据实际指向的对象类型来调用相应的函数,这种行为称为动态绑定,即在运行时确定调用的函数。

继承与多态的区别与联系

继承是指子类从父类继承属性和方法的过程,子类可以重写(override)父类的方法,以实现自己的特定功能。继承可以简化代码,减少重复的代码量,并且可以通过继承实现代码的复用。

多态是指同一种方法在不同对象上产生不同的行为。在多态的实现中,通常采用父类指针指向子类对象的方式,这样就可以通过父类指针调用子类方法,实现不同的行为。多态可以提高代码的灵活性和可扩展性,使得程序更易于维护和扩展。

区别:

  • 继承是一种代码复用的方式,可以从父类继承属性和方法;多态则是一种代码执行的方式,同一个方法在不同对象上有不同的行为。

  • 继承是一种静态的关系,类在编译时就确定了其继承关系;多态则是一种动态的关系,运行时才能确定具体的行为。

  • 继承是一种自上而下的设计方式,父类是子类的模板;多态则是一种自下而上的设计方式,子类决定了父类的行为。

联系:

  • 继承和多态都是面向对象编程的重要概念,它们都是实现代码复用、提高代码灵活性和可扩展性的重要方式。

  • 多态需要继承作为前提,因为父类指针可以指向子类对象,才能实现多态的效果。

示例

#include <iostream>
using namespace std;// 基类
class Shape {protected:int width, height;public:Shape( int a = 0, int b = 0) {width = a;height = b;}virtual int area() {cout << "Parent class area :" <<endl;return 0;}
};// 派生类
class Rectangle: public Shape {public:Rectangle( int a = 0, int b = 0):Shape(a, b) { }int area () { cout << "Rectangle class area :" <<endl;return (width * height); }
};// 派生类
class Triangle: public Shape{public:Triangle( int a = 0, int b = 0):Shape(a, b) { }int area () { cout << "Triangle class area :" <<endl;return (width * height / 2); }
};int main( ) {Shape *shape;Rectangle rec(10,7);Triangle  tri(10,5);// 存储矩形的地址shape = &rec;// 调用矩形的求面积函数 areashape->area();// 存储三角形的地址shape = &tri;// 调用三角形的求面积函数 areashape->area();return 0;
}

结果:

在这里插入图片描述

可以看到,程序中定义了一个基类 Shape 和两个派生类 Rectangle 和 Triangle,两个派生类公有继承基类的属性和方法,并且重写了基类的虚函数 area()。在 main() 函数中,首先创建了一个指向基类的指针 shape,然后将其分别指向 Rectangle 和 Triangle 对象。最后通过指针调用虚函数。shape指针两次调用area方法,但是由于该指针指向的是不同对象,他会根据对象的类型来输出不同的结果,这就是多态

继承和访问的权限

在 C++ 中,类继承分为三种类型:public、protected 和 private。它们分别表示基类成员在派生类中的访问权限:

  • public 继承:基类中的 public 成员在派生类中仍然是 public 的,基类中的 protected 成员在派生类中仍然是 protected 的,基类中的 private 成员仍然是私有的,private成员不能被派生类访问。

  • protected 继承:基类中的 public 成员在派生类中变成 protected 的,基类中的 protected 成员在派生类中仍然是 protected 的,并且只能被他的派生类成员函数和友元函数所访问,基类中的 private 成员不能被派生类访问。

  • private 继承:基类中的 public 和 protected 成员在派生类中变成 private 的,基类中的 private 成员不能被派生类访问。

说明

class Base {
public:int a;
protected:int b;
private:int c;
};class Derived1 : public Base {// a是public的,b是protected的,c不能访问
};class Derived2 : protected Base {// a是protected的,b是protected的,c不能访问
};class Derived3 : private Base {// a是private的,b是private的,c不能访问
};

示例:

#include <iostream>using namespace std;class Parent {
public:void publicMethod() {cout << "This is a public method of Parent class." << endl;}protected:void protectedMethod() {cout << "This is a protected method of Parent class." << endl;}private:void privateMethod() {cout << "This is a private method of Parent class." << endl;}
};class Child : public Parent {
public:void callParentMethods() {publicMethod();     // 公有方法可以在子类中直接访问protectedMethod();  // 保护方法可以在子类中直接访问// privateMethod();    // 私有方法不能在子类中直接访问}
};int main() {Child childObj;childObj.publicMethod();     // 公有方法可以在子类对象中直接访问// childObj.protectedMethod();  // 保护方法不能在子类对象中直接访问// childObj.privateMethod();    // 私有方法不能在子类对象中直接访问childObj.callParentMethods(); // 子类中的方法可以调用父类的公有和保护方法return 0;
}

在这个示例程序中,Parent类有三个成员方法,分别为publicMethod()protectedMethod()privateMethod(),它们的访问权限分别为public、protected和private。Child类继承了Parent类,并在其中定义了一个方法callParentMethods(),用于调用Parent类的publicMethod()和protectedMethod()方法。在main函数中,我们创建了一个Child类的对象childObj,并演示了不同的访问方式和权限。

结果

在这里插入图片描述

从这个示例程序中可以看出,public成员可以在任何地方被访问,包括在子类中和子类对象中;protected成员只能在子类和子类对象中被访问;private成员只能在类的内部被访问,包括子类中也不能访问。

**提示:**如果把继承方式改为私有继承或保护继承,那么main函数中的

childObj.publicMethod();

语句也会报错,因为保护或私有继承过来之后,公有方法的权限就变了,子类对象不能访问私有或保护的方法,那就更不能访问基类的公有方法了。

结论

在这里插入图片描述


http://www.ppmy.cn/news/64067.html

相关文章

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers 1. 指南(原文: Guidelines)1-1. 提示的指南(原文: Guidelines for Prompting)1-2. 配置1-3. 提示语原则(原文: Prompting Principles)原则 1: 写出清晰而具体的指示(原文: Write clear and spe…

【LeetCode】《LeetCode 101》第七章:动态规划

文章目录 7.1 算法解释7.2 基本动态规划&#xff1a;一维70. 爬楼梯&#xff08;简单&#xff09;198.打家劫舍&#xff08;中等&#xff09;413. 等差数列划分&#xff08;中等&#xff09; 7.3 基本动态规划&#xff1a;二维64. 最小路径和&#xff08;中等&#xff09;542. …

多项式指数函数(多项式 exp)

板题&#xff1a;P4726 【模板】多项式指数函数&#xff08;多项式 exp&#xff09; 已知 g ( x ) g(x) g(x)&#xff0c;你要求出 f ( x ) ≡ e g ( x ) ( m o d x n ) f(x)\equiv e^{g(x)} \pmod{x^n} f(x)≡eg(x)(modxn)。 前置知识&#xff1a;多项式求逆&#xff0c;…

C++ MFC调用JS代码获取返回值

C有时候会需要调用JS代码&#xff0c;这对于C来说或者对于国内来说一直是比较蛋疼的问题&#xff0c;主要是资料少&#xff0c;微软提供了一个COM组件&#xff0c;里面包含有JS引擎&#xff0c;这个组件就是&#xff1a;msscript.dll。 此文件在C:\Windows\SysWOW64目录下&…

webpack 5 实战(3)

四十一、代码拆分方式 通过Webpack实现前端项目整体模块化的优势很明显&#xff0c;但是它同样存在一些弊端&#xff0c;那就是项目当中所有的代码最终都会被打包到一起&#xff0c;试想一下&#xff0c;如果说应用非常复杂&#xff0c;模块非常多的话&#xff0c;那打包结果就…

有哪些入耳舒服的蓝牙耳机?公认佩戴舒适度最高蓝牙耳机

数码科技市场日益发展的更加智能化&#xff0c;日常所接触到的各类产品都开始往智能化发展&#xff0c;鲜为人知的蓝牙耳机一直是不过时的&#xff0c;因为小巧易携带深受大众喜欢&#xff0c;下面整理了几款佩戴舒适的蓝牙耳机给大家。 一、南卡小音舱Lite2蓝牙耳机 售价&am…

spi 设备注册分析

/* * spi 设备注册分析 */ 1. kernel/drivers/spi/spi.c 初始化设备 device_initialize /* 调用device_initialize 的会有这些函数 */ spi_match_controller_to_boardinfo spi_new_device spi_alloc_devi…

二、PEMFC基础之电化学与反应动力学

二、PEMFC基础之电化学与反应动力学 1.电流、电流密度2.反应速率常数3.交换电流密度4.电化学动力学奠基石B-V方程5.活化损失计算Tafel公式6.计算案例 1.电流、电流密度 由法拉第定律 i d Q d t n F d N d t i\frac{dQ}{dt}\frac{nFdN}{dt} idtdQ​dtnFdN​ j i A j\frac{…