首页 > 编程语言 >128.用C语言实现C++的继承

128.用C语言实现C++的继承

时间:2023-08-02 21:45:02浏览次数:52  
标签:调用 子类 同名 C++ C语言 fun 128 父类

128.用C语言实现C++的继承

#include <iostream>
using namespace std;

//C++中的继承与多态
struct A
{
    virtual void fun()  //C++中的多态:通过虚函数实现
    {
        cout << "A:fun()" << endl;
    }
    int a;
};

struct B :public A     //C++中的继承:B类公有继承A类
{
    virtual void fun()  //C++中的多态:通过虚函数实现(子类的关键字virtual可加可不加)
    {
        cout << "B:fun()" << endl;
    }

    int b;
};

//C语言模拟C++的继承与多态
typedef void (*FUN)();   //定义一个函数指针来实现对成员函数的继承
struct _A    //父类
{
    FUN _fun;  //由于C语言中结构体不能包含函数,故只能用函数指针在外面实现
    int _a;
};

struct _B     //子类
{
    _A _a_;   //在子类中定义一个基类的对象即可实现对父类的继承
    int _b;
};

void _fA()    //父类的同名函数
{
    printf("_A:_fun()\n");
}

void _fB()    //子类的同名函数
{
    printf("_B:_fun()\n");
}

void Test()
{
    //测试C++中的继承与多态
    A a;  //定义一个父类对象a
    B b;  //定义一个子类对象b

    A* p1 = &a;  //定义一个父类指针指向父类的对象
    p1->fun();  //调用父类的同名函数
    p1 = &b;   //让父类指针指向子类的对象
    p1->fun();  //调用子类的同名函数

    //C语言模拟继承与多态的测试
    _A _a;  //定义一个父类对象_a
    _B _b;  //定义一个子类对象_b
    _a._fun = _fA;    //父类的对象调用父类的同名函数
    _b._a_._fun = _fB;  //子类的对象调用子类的同名函数

    _A* p2 = &_a;  //定义一个父类指针指向父类的对象
    p2->_fun();   //调用父类的同名函数
    p2 = (_A*)&_b; //让父类指针指向子类的对象,由于类型不匹配所以要进行强转
    p2->_fun();   //调用子类的同名函数
}

标签:调用,子类,同名,C++,C语言,fun,128,父类
From: https://www.cnblogs.com/codemagiciant/p/17601834.html

相关文章

  • c++控制台时钟显示时间
    在旧电脑上刷了ubuntu的服务器版本,开着的时候旧电脑(yoga)的屏幕就处于了无用的状态。为了更好的利用这个屏幕,简单使用c++写了一个显示时间的代码。由于这台yoga的屏幕是可以360翻转的,所以给时间的显示也增加了一点翻转功能。1#include<iostream>2#include<ctime>3#......
  • c语言链表demo
    #include<stdio.h>#include<stdlib.h>//定义节点结构体structnode{intdata;structnode*next;/*注意:这行使用了node,node必须在这行之前定义*/};intmain(intargc,constchar*argv[]){//1.定义链表的头节点,并初始化structno......
  • 初学C语言day08--字符串
    字符串字符:字符是在计算机中以整数形式存储的,在需要显示成字符时会根据ASCII表中对应的关系,来显示对应的符号或图案'\0'0空字符'0'48'A'65'a'97串:是一种数据结构,是由一组连续的若干个类型相同的数据组成,末尾有一个结束标志对于这种数据结构的处理......
  • 恶意代码分析实战 lab 20-1 20-2 20-3 C++恶意代码分析,难度提升
    本次实验我们将会分析lab20-1,lab20-2文件。先来看看要求解答的问题Lab20-1需要回答的问题如下Q1.在0x401040处的函数采用了什么参数?Q2.哪个URL被用来调用URLDownloadToFile?Q3.这个程序做了什么事情?在实验任务一当中我们来分析lab20-1首先载入IDA第一个call是在401008,是一个......
  • C++逆向分析——友元、内部类、命名空间和static
    友元友元可以理解为:朋友、元素;老师认为这个友元是C++中的一个垃圾,因为友元的存在破坏了面向对象的封装性,不推荐使用,之所以有这个章节是因为有人不了解这个概念。注意:在一些新版本的C++编译器里面已经不再提供类似于友元这样的特性了。大家都知道在C++中对象的私有成员,外部是无法访......
  • C++逆向分析——对象拷贝
    对象拷贝我们通常存储对象,都用数组、列表之类的来存储,那如下所示我们使用数组来存储对象,但是在工作中发现这个数组不够用了,就需要一个更大的数据,但我们重新创建一个数组还需要把原来的数据复制过来;在C语言中可以使用函数来进行拷贝,直接拷贝内存,在C++中实际上跟C语言要做的事情是一......
  • C++逆向分析——模版
    模版假设有一个冒泡排序的函数:voidSort(int*arr,intnLength){inti,k;for(i=0;i<nLength;i++){for(k=0;k<nLength-1-i;k++){if(arr[k]>arr[k+1]){inttemp=arr[k];arr[k]=arr[k+1];arr[k+1]=temp;}}}}但是这个冒......
  • C++逆向分析——运算符重载
    运算符重载现在有一个类,其中有一个函数用于比较2个类的成员大小:#include<stdio.h>classNumber{private:intx;inty;public:Number(intx,inty){this->x=x;this->y=y;}intMax(Number&n){returnthis->x>n.x&&this->y......
  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接调用的流程......
  • C++逆向分析——继承与封装
    面向对象程序设计之继承与封装之前已经学习过继承和封装了,但是要在实际开发中使用,光学语法和原理是不够的,在设计层面我们需要做一些优化。如下代码是继承的例子:#include<stdio.h>classPerson{public:intAge;intSex;voidWork(){printf("Person:Work()"......