C++接口的定义与实现的详细过程
1.接口的定义与实现
所谓的接口,即将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后在派生类中实现纯虚函数的具体定义的方式实现接口,不同派生类实现接口的方式也不尽相同,从而实现多态。现通过一个简单的实例讲解具体实现步骤(⊙o⊙)。
1.1类接口的定义 通常在头文件中完成类接口的定义 /*InterfaceDefineAndRealize.h*/
- #ifndef INTERFACE_DEFINE_AND_REALIZE
- #define INTERFACE_DEFINE_AND_REALIZE
- #include <string>
- using std::string;
- //define interface
- class Person
- {
- public:
- Person():m_StrName("###") //成员列表初始化参数
- {};
- virtual ~Person(){};
- virtual void Eat()=0;//人需要吃东西
- virtual void Sleep()=0;//人需要睡觉
- virtual void SetName(const string strName)=0;//人都有名字
- virtual string GetName()=0;//获取名字
- virtual void Work()=0;//人可能要有工作
- private:
- string m_StrName;
- };
- //实现接口
- //实现接口是通过派生类实现的,每个派生类依据自身特点,可以获取同一接口的不同实现
- //也就是所谓的多态
- class Student:public Person
- {
- public:
- Student():m_strName("***")
- {};
- ~Student()
- {};
- void Eat();
- void Sleep();
- void SetName(const string strName);
- string GetName();
- void Work();
- private:
- string m_strName;
- };
- #endif
1.2 接口的实现 通常在源文件中完成接口的实现 /*InterfaceDefineAndRealize.cpp*/
- #include "InterfaceDefineAndRealize.h"
- #include <iostream>
- #include <string>
- using std::string;
- using std::cout;
- using std::endl;
- //接口的外部实现
- void Student::Sleep()
- {
- cout<<"student sleep."<<endl;
- }
- void Student::Eat()
- {
- cout<<"student eat."<<endl;
- }
- void Student::SetName(const string strName)
- {
- m_strName=strName;
- }
- void Student::Work()
- {
- cout<<"student work."<<endl;
- }
- string Student::GetName()
- {
- return m_strName;
- }
- //需要导出的函数,即用户在外部可以调用的接口
- _declspec(dllexport)bool GetPersonObject(void** _RtObject)
- {
- Person* pMan=NULL;
- pMan=new Student();
- *_RtObject=(void*)pMan;
- return true;
- }
1.3 接口的导出 通常在模块定义文件中完成 /*InterfaceDefineAndRealize.def*/
- LIBRARY InterfaceDefineAndRealize
- EXPORTS
- GetPersonObject
新建项目,加载上述三个文件,设置项目属性—>配置属性——>常规——>配置类型 ,选择"动态库.dlll",生成可用的动态库,假如项目名称为InterfaceDefineAndRealize(注意:项目名称必须与模块定义文件中 LIBRARY 后面定义的名字相同,否则将导致出现无法找到动态库的错误。),则在该项目的当前工作目录下位生成动态库和它的导入库。
2. 接口的调用
为了与常规的调用动态库的方式保持一致,这里做一些额外工作。新建“include”文件夹,并将InterfaceDefineAndRealize.h放到此文件夹下,新建“lib”文件夹并将InterfaceDefineAndRealize.lib文件放到此文件夹下。新建项目UsingInterface,添加源文件实现调用接口的功能。
2.1 为项目添加附加包含目录
方法1:项目属性——>配置属性——>C/C++——>常规——>附加包含目录 将include文件夹的全路径添加进来。
方法2:项目属性——>配置属性——>VC++目录——>包含目录 中将include文件夹的全路径添加进来。
2.2 为项目添加附加库
方法1:项目属性——>配置属性——>链接器——>常规——>附加库目录 将lib文件夹的全路径添加进来。
方法2:项目属性——>配置属性——>VC++目录——>库目录 将lib文件夹的全路径添加进来。
注意:2.1中的方法1与2.2中的方法1对应,2.1中的方法2与2.2中的方法2对应,不能不换使用。
2.3 为项目添加导入库
项目属性——>配置属性——>链接器——>输入——>附加依赖项 中添加InterfaceDefineAndRealize.lib
2.4 为项目提供动态库
将生成的.dll动态库放到项目的当前目录下的Debug目录下,防止出现缺少动态库的错误。
2.5 编写代码,实现接口的调用
- #include <iostream>
- #include "InterfaceDefineAndRealize.h"
- bool _declspec(dllimport) GetPersonObject(void** _RtObject);
- int main()
- {
- Person* person=NULL;
- void* pObj=NULL;
- if(GetPersonObject(&pObj))//调用接口
- {
- person=(Person*)pObj;
- person->Eat();
- person->Sleep();
- person->SetName("zhang hui");
- std::cout<<person->GetName()<<std::endl;
- person->Work();
- if(person!=NULL)
- {
- delete person;
- person=NULL;
- }
- }
- system("pause");
- return 0;
- }
注:以上代码仅为个人理解,可能存在错误或叙述不正确的地方,希望给予指正,谢谢。
C++接口的定义与实现的详细过程的更多相关文章
- java中接口的定义和接口的实现
1.接口的定义 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interfa ...
- java中接口的定义与实现
1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,当中接口体由常量定义和方法定义两部分组成.定义接口的基本格式例如以下: [修饰符] in ...
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...
- java面向对象(封装,继承,多态,抽象,接口的定义和实现)
1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...
- java面向对象程序设计(下)-接口的定义
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...
- java接口中定义成员变量
//抽象类中可以定义如下成员变量:public abstract class People { public String name; public int age; public abstract ...
- C++中 接口的定义 COM
首先定义一个虚基类的接口,其中包含虚函数AddRef Release QueryInterface,(MFC 类IUnKnown unknwn.h)分别是增加减去引用计数和查询接口然后定义一个实现类, ...
- java 子接口中定义与父接口相同的方法
今天碰到一个很有意思的问题,在java中如果子接口中定义了与父接口中已经有的方法会发生什么事情呢?比如: interface IRunnable extends Runnable{ void run( ...
- 简单学JAVA之---接口的定义与实现
为了巩固自己学习的知识,可能会对自己以后所学的知识做一个小结,今天就来一篇接口的定义与实现. 在java中,我们可以通过继承得到另一个类中的方法,但是这个仅仅满足继承一个方法,那有办法可以多个继承不, ...
随机推荐
- Angular2发布思路(整理官网Deployment页面)
本文是按着ng2官网的高级内容“Deployment”的思路整理得出的,原文虽然在angular2的中文站下挂着,截止目前却还是英文版未翻译,笔者就在这里结合自己的理解给出原文的一点点整理.这是原文地 ...
- ubuntu如何进入local、bin目录
回到home目录,输入命令:cd /usr/local 若要进入bin目录,输入命令:cd /usr/local/bin
- 极客君教你破解隔壁妹子的wifi密码,成功率高达90%
首先,给大家推荐一个我自己维护的网站: 开发者网址导航:http://www.dev666.com/ 破解wifi密码听起来很复杂,实际上也不是非常的复杂,极客君(微信公众帐号:极客峰)今天教大家如何 ...
- maven工程莫名其妙只在项目名称那里有一个红叉
manven工程里面没有报错的地方,编译也没有问题,只是项目名称那里有一个红叉. 解决办法: 右击项目-->maven-->update project 注意: 这种方法有时可 ...
- JS中的异步以及事件轮询机制
一.JS为何是单线程的? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊.(在JAVA和c#中的异步 ...
- Nagios邮件报警
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; fon ...
- Knockout Mvc Compoment FrameSet
Knockout Mvc Compoment FrameSet 框架文件结构 01- 网站(表现层),mvc主要作用视图展示. 02- 模型(Model),主要作用承载视图数据结构,网站前后台 ...
- Java面试题:Servlet是线程安全的吗?
Servlet不是线程安全的. 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP请求时 ...
- DC平衡双向控制串行器 转接IC GM8913:LVTTL转FPD-LINK III芯片
1 概述 GM8913型DC平衡双向控制串行器,其主要功能是实现将10或12位并行控制信号和一路时钟信号串行为一路2.8Gbps高速串行数据:同时接收低速通道信号实现模式配对的功能.芯片内部集 ...
- android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
我们在设计软件的时候,需要记录软件设置的基本信息,那么怎么来保存他们呢?我们可以使用SharedPreferences. SharedPreferences是一个xml文件,用来存储软件的常规设置 ...