首页 > 其他分享 >C模拟CPP的方法重写(override)和多态

C模拟CPP的方法重写(override)和多态

时间:2023-09-21 14:46:07浏览次数:38  
标签:fs struct 子类 void father 多态 CPP override 父类

1. 所谓override,就是子类中重新实现了父类中的某一方法(子类和父类的同一个方法的方法体不同)

2. 所谓多态,最显著的一个特点就是父类指针指向不同的子类对象时,运行同一个方法会有不同的行为

3. C语言模拟继承时,父类对象必须是子类对象的第一个成员

4. 理解了C的父类结构体指针子类结构体变量,就不难理解Cpp/Java中的父类引用指向子类对象了!

#include <stdio.h>

void fatherInfo() {
  printf("I am father\n");
}

void sonInfo() {
  printf("I am son\n");
}

void daughterInfo() {
  printf("I am daughter\n");
}

//父结构体
struct father
{
    // function pointer
    void (*printInfo)();
    int f1;
};

struct son
{
    //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位
    struct father fs;
    int s1;

};

struct daughter {
  //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位
  struct father fs;
  int d1;
  
};

int main(void)
{
    // 分别定义子类结构体变量s和d
    struct son s;
    struct daughter d;

    // 定义一个指针数组,数组的每一个元素都是父类指针,但是指向的对象时子类对象
    /* 这种定义方式会有警告但是可以正常运行。
    出现警告是因为指针类型不匹配,需要使用强制类型转换.
    struct father* arr[] = {(struct father*)&s, (struct father*)&d}; 
    */
    struct father* arr[] = {&s, &d};  

    // 初始化子类对象s
    s.fs.printInfo = sonInfo;  // 子类override父类的方法
    s.fs.f1 = 10;
    s.s1 = 20;
    // 初始化子类对象d
    d.fs.printInfo = daughterInfo;  // 子类override父类的方法
    d.fs.f1 = 100;
    d.d1 = 200;
    
    // 多态测试
    arr[0]->printInfo();
    arr[1]->printInfo();

    return 0;
}

5.pythontutor运行结果

标签:fs,struct,子类,void,father,多态,CPP,override,父类
From: https://www.cnblogs.com/gjsun/p/17719850.html

相关文章

  • Java学习之路--oop--面向对象编程(封装、继承、多态)01
    packagecom.oop.demo01;importjava.io.IOException;//什么是面向对象/*面向对象编程:Object-OrientedPrograming(简称OOP)面向对象编程的本质就是:**以类的方式组织代码,以对象的组织(封装)数据抽象三大特性:封装继承多态*///Demo01-类publicclassDemo01{publicstaticvoid......
  • Java学习之路--oop--面向对象编程(封装、继承、多态)03
    packagecom.oop.demo04;/*封装:设计程序要追求“高内聚,低耦合”属性私有,get/set封装的意义:1.提高程序的安全性,保护数据2.隐藏代码的实现细节3.统一接口4.系统的可维护性增加*/publicclassApplication{publicstaticvoidmain(String[]args){Students1=newS......
  • Java学习之路--oop--面向对象编程(封装、继承、多态)02
    packagecom.oop.demo02;//一个项目应该只存一个main方法publicclassApplication{publicstaticvoidmain(String[]args){//new实例化了一个对象Personperson=newPerson("无言");System.out.println(person.name);}}////类:抽象......
  • JAVA17/JAVA21接口和多态机制
    day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关系6.【掌握】单继承多实现7.【理解】接口之间的多继承8.【掌握】接口的案例9.【理解】什么是多态......
  • 类,封装,继承,多态
    Student.java学生类:importjava.util.Objects;importjava.util.Scanner;publicclassStudent{staticintage;staticStringid,subject;staticStringname="张晗";//name="张晗"//非法,因为在class类中,赋值操作语句只允许在成员函数中才可......
  • 解决安装VS2022时,出现未能安装包"Microsoft.VisualCpp.Redist.14,version=14.32.31332
    解决安装VS2022时,出现未能安装包"Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86"问题描述之前安装过MSSQLServer和VS2022,但是后来又卸载了。现在重装VS2022出现两个报错:无法安装Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86无法安装Micr......
  • 封装,继承,多态(下)
    8.5多态一个对象可以有多种形态。一个对象现在可以是学生类的对象,也可是老师类的对象。要形成多态必须是父类对象中存放子类的实例,用父类对象去调用子类重写的方法。语法:父类对象名=new子类();例如:QianFengstu=newStudent();QianFengtea=newTeacher();类图,可以反映出一......
  • 解决 ChatGLM.CPP+clBlast 编译错误(也适用于SD.CPP)
    首先安装OpenCL和clblast:vcpkginstallopenclclblast下载GitHub上的源码:gitclone--recurse-submoduleshttps://github.com/li-plus/chatglm.cppcdchatglm.cpp这个项目GGML子仓库中,third_party/ggml/src/CMakeList.txt有个错误。打开并找到178-183行: find_......
  • 封装,继承,多态(上)
    8.1封装将一系列零碎的代码用方法的形式把它组装在一起形成一个完整的功能就是封装(这是广义的封装)。狭义的封装,就是将以前对类的成员变量的赋值取值操作把它们放到方法中去,用方法的方式来实现赋值和取值。Peoplezhangpeng=newPeople();zhangpeng.name="张鹏";......
  • 多态
                ......