1.接口的定义与实现

所谓的接口,即将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后在派生类中实现纯虚函数的具体定义的方式实现接口,不同派生类实现接口的方式也不尽相同,从而实现多态。现通过一个简单的实例讲解具体实现步骤(⊙o⊙)。

1.1类接口的定义    通常在头文件中完成类接口的定义 /*InterfaceDefineAndRealize.h*/

  1. #ifndef INTERFACE_DEFINE_AND_REALIZE
  2. #define INTERFACE_DEFINE_AND_REALIZE
  3. #include <string>
  4. using std::string;
  5. //define interface
  6. class Person
  7. {
  8. public:
  9. Person():m_StrName("###") //成员列表初始化参数
  10. {};
  11. virtual ~Person(){};
  12. virtual void Eat()=0;//人需要吃东西
  13. virtual void Sleep()=0;//人需要睡觉
  14. virtual void SetName(const string strName)=0;//人都有名字
  15. virtual string GetName()=0;//获取名字
  16. virtual void Work()=0;//人可能要有工作
  17. private:
  18. string m_StrName;
  19. };
  20. //实现接口
  21. //实现接口是通过派生类实现的,每个派生类依据自身特点,可以获取同一接口的不同实现
  22. //也就是所谓的多态
  23. class Student:public Person
  24. {
  25. public:
  26. Student():m_strName("***")
  27. {};
  28. ~Student()
  29. {};
  30. void Eat();
  31. void Sleep();
  32. void SetName(const string strName);
  33. string GetName();
  34. void Work();
  35. private:
  36. string m_strName;
  37. };
  38. #endif

1.2 接口的实现  通常在源文件中完成接口的实现 /*InterfaceDefineAndRealize.cpp*/

  1. #include "InterfaceDefineAndRealize.h"
  2. #include <iostream>
  3. #include <string>
  4. using std::string;
  5. using std::cout;
  6. using std::endl;
  7. //接口的外部实现
  8. void Student::Sleep()
  9. {
  10. cout<<"student sleep."<<endl;
  11. }
  12. void Student::Eat()
  13. {
  14. cout<<"student eat."<<endl;
  15. }
  16. void Student::SetName(const string strName)
  17. {
  18. m_strName=strName;
  19. }
  20. void Student::Work()
  21. {
  22. cout<<"student work."<<endl;
  23. }
  24. string Student::GetName()
  25. {
  26. return m_strName;
  27. }
  28. //需要导出的函数,即用户在外部可以调用的接口
  29. _declspec(dllexport)bool GetPersonObject(void** _RtObject)
  30. {
  31. Person* pMan=NULL;
  32. pMan=new Student();
  33. *_RtObject=(void*)pMan;
  34. return true;
  35. }

1.3 接口的导出  通常在模块定义文件中完成 /*InterfaceDefineAndRealize.def*/

  1. LIBRARY InterfaceDefineAndRealize
  2. EXPORTS
  3. 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  编写代码,实现接口的调用

  1. #include <iostream>
  2. #include "InterfaceDefineAndRealize.h"
  3. bool _declspec(dllimport) GetPersonObject(void** _RtObject);
  4. int main()
  5. {
  6. Person* person=NULL;
  7. void* pObj=NULL;
  8. if(GetPersonObject(&pObj))//调用接口
  9. {
  10. person=(Person*)pObj;
  11. person->Eat();
  12. person->Sleep();
  13. person->SetName("zhang hui");
  14. std::cout<<person->GetName()<<std::endl;
  15. person->Work();
  16. if(person!=NULL)
  17. {
  18. delete person;
  19. person=NULL;
  20. }
  21. }
  22. system("pause");
  23. return 0;
  24. }

注:以上代码仅为个人理解,可能存在错误或叙述不正确的地方,希望给予指正,谢谢。

C++接口的定义与实现的详细过程的更多相关文章

  1. java中接口的定义和接口的实现

    1.接口的定义 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interfa ...

  2. java中接口的定义与实现

    1.定义接口     使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,当中接口体由常量定义和方法定义两部分组成.定义接口的基本格式例如以下: [修饰符] in ...

  3. 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现

        最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA.     有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...

  4. java面向对象(封装,继承,多态,抽象,接口的定义和实现)

    1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...

  5. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  6. java接口中定义成员变量

    //抽象类中可以定义如下成员变量:public abstract class People { public String name; public int age; public abstract ...

  7. C++中 接口的定义 COM

    首先定义一个虚基类的接口,其中包含虚函数AddRef Release QueryInterface,(MFC 类IUnKnown unknwn.h)分别是增加减去引用计数和查询接口然后定义一个实现类, ...

  8. java 子接口中定义与父接口相同的方法

    今天碰到一个很有意思的问题,在java中如果子接口中定义了与父接口中已经有的方法会发生什么事情呢?比如: interface IRunnable extends Runnable{ void run( ...

  9. 简单学JAVA之---接口的定义与实现

    为了巩固自己学习的知识,可能会对自己以后所学的知识做一个小结,今天就来一篇接口的定义与实现. 在java中,我们可以通过继承得到另一个类中的方法,但是这个仅仅满足继承一个方法,那有办法可以多个继承不, ...

随机推荐

  1. warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]

    struct test{int a=1111111; }test; vincentdeMacBook-Air:datasturte vincent$ g++ struct.cpp -o structp ...

  2. 分离数据库时出错:无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法

    出现的原因是要分离的数据库是一个发布订阅的数据库.因为正在复制,所以无法脱机. 解决办法是停止发布订阅,或者删掉它..再分离.有部分情况是在复制目录下并没有看到发布订阅. 有可能是因为以前建立发布订阅 ...

  3. node.js报错throw err; // Rethrow non-MySQL errors e:\serverTest\node_modules\mysql\lib\protocol\Parser.js:79 解决方法

    今天在用node+angular做后台时,需要使用session保存登陆状态的时候,遇到了此问题,问题直译为非mysql问题,我也在后台取到的登陆用户名和密码,确实不是数据库问题.最后发现在使用ses ...

  4. MIT 计算机科学及编程导论 Python 笔记 1

    计算机科学及编程导论在 MIT 的课程编号是 6.00.1,是计算机科学及工程学院的经典课程.之前,课程一直使用 Scheme 作为教学语言,不过由于 Python 简单.易学等原因,近年来已经改用 ...

  5. 转载 webstrom识别 React语法

    对于程序员而言:驼峰和下划线之间是一场宗派战争:大括号是否换行会成为一种党派:逗号写在行尾还是行首的人来自不同星球-- 然而,无规矩不成方圆,任何一个团队,要想有高质量的产出,第一步必须要对一些基本的 ...

  6. PRINCE2的国际形势?光环国际项目管理培训

    PRINCE2的使用和应用非常广泛.在过去的12个月里,超过60,000人参加了PRINCE2基础资格(Foundation)或从业资格(Practitioner)考试.现在每周参加考试的人数超过了2 ...

  7. Linux怎样创建FTP服务器

    在创建FTP服务器之有先命令: ps -ef |grep vsftpd 查一下系统有没有安装vsftpd这个服务器,如果出现如下图所示的界面说明没有安装.   然后再执行:yum install vs ...

  8. jquery处理checkbox(复选框)是否被选中

    现在如果一个复选框被选中,是用checked=true,checked="checked"也行 要用prop代替attr会更好,虽然在jQuery1.6之前版本的attr()方法能 ...

  9. jquery判断邮箱对错

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. C# 超高速高性能写日志 代码开源

    1.需求 需求很简单,就是在C#开发中高速写日志.比如在高并发,高流量的地方需要写日志.我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到的. ...