C实现面向对象封装、继承、多态
参考资料:
http://blog.chinaunix.net/uid-26750235-id-3102371.html
http://www.eventhelix.com/realtimemantra/basics/ComparingCPPAndCPerformance2.htm#.U0jCR7KBR7h
说明:
Shape类为基类,包含typeName,虚函数为求解Shape的周长、面积、析构函数
头文件 Cobject.h
#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;
源文件 Cobject.c
#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;
return ( tri->a + tri->b + tri->c)/2;
} 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;
return 2*(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};
测试文件 CobjectTest.cpp
extern "C"{
#include "Cobject.h"
};
#include <iostream>
using namespace std;
int main()
{
Shape *shape[2];
//创建Triangle
shape[0]=(Shape*)TriCreate(1,3,2);
//创建Rectangle
shape[1]=(Shape*)RectCreate(2,3);
for(int i=0;i<2;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实现面向对象封装、继承、多态的更多相关文章
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- 浅谈学习C++时用到的【封装继承多态】三个概念
封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- OOP三大核心封装继承多态
OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
随机推荐
- 基于HTML5 的人脸识别活体认证
近几年,人脸识别技术在身份认证领域的应用已经有了较多应用,例如:支付宝.招行的取款.养老金领取等方面,但在杜绝假冒.认证安全性等方面,目前还是一个比较需要进一步解决的课题,特别是在移动端的活体认证技术 ...
- azure注册码
用户名:aaa 注册秘钥:2GQrt5XHYY7SBK/4b22Gm4Dh8alaR0/0k3gEN5h7FkVPIn8oG3uphlOeytIajx 注册用户名:www.yuanxingku.com ...
- 13)Java static
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: ...
- reader,字符流
1. public class Demo1 { public static void main(String[] args) throws IOException { File file = new ...
- 编写测试类,了解ArrayList的方法
这篇文章主要介绍了C#中动态数组用法,实例分析了C#中ArrayList实现动态数组的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#中动态数组用法.分享给大家供大家参考.具体分析如下 ...
- 内存分配函数malloc、realloc、calloc、_alloca
1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...
- linux MTD系统解析(转)
MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口.MTD将文件系统与底层FLASH存储 ...
- 从基础开始,从一个SQLHelper开始
最开始考虑的问题有这三点: 1.Access和SQLServer都要能用. 2.尽量简单,清晰. 3.性能不出大问题. public class SQLHelp { #region 私有域 priva ...
- 算法系列7《CVN》
计算CVN时使用二个64位的验证密钥,KeyA和KeyB. 1) 计算CVN 的数据源包括: 主账号(PAN).卡失效期和服务代码,从左至右顺序编排. 4123456789012345+8701+11 ...
- R 中安装xlsx包缺少java环境解决方案
1.安装Java程序(官网win7 64位系统的Java安装程序及网址http://www.java.com/zh_CN/download/manual.jsp),选择windows 64位脱机安装到 ...