Shape类为基类，包含typeName，虚函数为求解Shape的周长、面积、析构函数

```#pragma once

/*
*    使用C实现面向对象编程：封装、继承、多态
*/

//基类
struct Shape
{
char *typeName;
struct ShapeOps *ops;
};

//基类虚函数指针
struct ShapeOps
{
float (*OpsArea)(struct Shape* shape);    //求面积
int (*OpsPerimeter)(struct Shape* shape);    //求周长
void (*OpsDestory)(struct Shape *shape);    //析构对象
};

//基类的虚函数
float Area(struct Shape *shape);
int Perimeter(struct Shape *shape);
void Destory(struct Shape *shape);

/*********************************************************************************/

//派生类“三角形”triangle
struct Triangle
{
struct Shape shape;
int a;
int b;
int c;
};

//派生类接口
struct Triangle* TriCreate(int a,int b,int c);
float TriArea(struct Shape *triangle);
int TriPerimeter(struct Shape *triangle);
void TriDestory(struct Shape *triangle);

extern struct ShapeOps TriangleOps;

/*********************************************************************************/

//派生类“矩形” rectangle
struct Rectangle
{
struct Shape shape;
int w;
int h;
};

//派生类接口
struct Rectangle* RectCreate(int w,int h);
float RectArea(struct Shape *rectangle);
int RectPerimeter(struct Shape *rectangle);
void RectDestory(struct Shape *rectangle);

extern  struct ShapeOps RectangleOps;```

```#include "Cobject.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//基类接口
float Area(struct Shape *shape)
{
assert(shape != NULL);
return shape->ops->OpsArea(shape);
}

int Perimeter(struct Shape *shape)
{
assert(shape != NULL);
return shape->ops->OpsPerimeter(shape);
}

void Destory(struct Shape *shape)
{
assert(shape != NULL);
printf("%s Destory\n",shape->typeName);
shape->ops->OpsDestory(shape);
}

//Triangle 具体接口实现
struct Triangle* TriCreate(int a,int b,int c)
{
struct Triangle *tri=(struct Triangle *)(malloc(sizeof(struct Triangle)));
tri->shape.typeName="Triangle";
tri->shape.ops=&TriangleOps;
tri->a=a;
tri->b=b;
tri->c=c;

return tri;
}

float TriArea(struct Shape *shape)
{
struct Triangle *tri;
assert(shape != NULL);
tri=(struct Triangle *)(shape);
return (float)(tri->a * tri->b * tri->c);
}

int TriPerimeter(struct Shape *shape)
{
struct Triangle *tri;
assert( shape != NULL);
tri=(struct Triangle *)shape;
;
}

void TriDestory(struct Shape *shape)
{
struct Triangle *tri;
assert(shape != NULL);
tri =(struct Triangle *)shape;
free(tri);
}

struct ShapeOps TriangleOps={TriArea,TriPerimeter,TriDestory};

//Rectangle 具体接口实现
struct Rectangle *RectCreate(int w,int h)
{
struct Rectangle * rect=(struct Rectangle *)malloc(sizeof(struct Rectangle));
rect->shape.typeName="Rectangle";
rect->shape.ops=&RectangleOps;
rect->w=w;
rect->h=h;

return rect;
}

float RectArea(struct Shape *shape)
{
struct Rectangle *rect;
assert( shape !=NULL );
rect=(struct Rectangle *)shape;
return (float)(rect->h * rect->w );
}

int RectPerimeter(struct Shape *shape)
{
struct Rectangle *rect;
assert(shape != NULL );
rect=(struct Rectangle *)shape;
*(rect->h + rect->w);
}

void RectDestory(struct Shape *shape)
{
struct Rectangle *rect;
assert(shape != NULL);
rect=(struct Rectangle *)shape;
free(rect);
}

struct ShapeOps RectangleOps={RectArea,RectPerimeter,RectDestory};```

```extern "C"{
#include "Cobject.h"
};
#include <iostream>
using namespace std;

int main()
{
Shape *shape[];

//创建Triangle
shape[]=(Shape*)TriCreate(,,);

//创建Rectangle
shape[]=(Shape*)RectCreate(,);

;i<;i++)
{
cout<<"Area: "<<Area(shape[i])<<endl;
cout<<"Perimeter: "<<Perimeter(shape[i])<<endl;
Destory(shape[i]);
}
}```

1、C不支持函数重载，以及函数默认参数

2、头文件中函数名默认为extern

3、C++调用C函数，使用extern “C”

C实现面向对象封装、继承、多态的更多相关文章

1. java面向对象（封装-继承-多态）

框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

2. 浅谈学习C++时用到的【封装继承多态】三个概念

封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

3. Java三大特性(封装,继承,多态)

Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

4. C语言设计模式-封装-继承-多态

快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

5. java四大特性理解（封装继承多态抽象）

封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

6. 初识JAVA（【面向对象】：pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法；泛型、垃圾回收机制、反射和RTTI）

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...

7. C# 面向对象基础&amp;封装&amp;继承&amp;多态&amp;加深一下冒泡排序写法

(一)面向对象是什么? 面向对象是一种编程思想 (二)为什么要用面向对象? 1.结构清晰 2.易于维护 3.方便扩展 (三)new一个对象是什么过程? 实例化构造函数创建对象的过程就是将类实例化的过程 ...

8. 谈CSS模块化【封装-继承-多态】

第一次听到“CSS模块化”这个词是在WebReBuild的第四届“重构人生”年会上,当时我还想,“哈,CSS也有模块化,我没听错吧?”事实上,我没听错,你也没看错,早就有CSS模块化这个概念了.之所以 ...

9. JAVA的三大特征 封装继承多态- 简单总结

简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

10. C++学习笔记 封装 继承 多态 重写 重载 重定义

C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

随机推荐

1. Web API 之CRUD

注:例子来自微软Web API官网(https://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part ...

2. jetty 内嵌服务

pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodin ...

3. css3 风车旋转

<style> .box{width:400px;height:400px;margin:100px auto;transition:1s;} .box div{width:180px;h ...

4. HTML-学习笔记（文本格式化,引用，计算机代码）

HTML 可定义很多供格式化输出的元素,比如粗体和斜体字. <b>定义粗体字体 <p>这是一段<b>粗体字体</b>通过标签定义</p> & ...

5. java并发：线程同步机制之计数器&amp;Exechanger

第一节 CountDownLatch (1)初识CountDownLatch (2)详述CountDownLatch CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量. ...

6. ARM汇编中的标号

标号(LABEL)是为一组机器指令所起名字,表示程序中的指令或者数据地址的符号.标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号.通过在目标地址的前面放上一个标号,可以在指令中使用 ...

7. 调用wcf 得不到HttpWebResponse.ContentLength的长度

HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(strUrl); wreq.Timeout = _httpTimeout * ; wre ...

8. （Loadrunner）Error: Failed to send data by channels - post message failed.（转）

把Diagnotics-configure-Web Page Diagnotics 设置为 转自: http://www.51testing.com/html/64/371664-3708254.ht ...

9. dedecms lnmp 环境搭建。备忘录非教程

ssh链接到linux服务器,我用的centos 6.5 64位的. #设置dns,ect/reserv.conf 设置,注释掉原来的nameserver,添加nameserver=8.8.8.8访问 ...

10. wikioi 3038 3n+1问题

题目描述 Description 3n+1问题是一个简单有趣而又没有解决的数学问题.这个问题是由L. Collatz在1937年提出的.克拉兹问题(Collatz problem)也被叫做hailst ...