1、接口声明头文件

首先声明一个形状基类,然后是三个派生类三角形、长方形和圆形。

基类中只有一个函数,getArea()输出面积
三个派生类分别对getArea()重载,分别有各自的构造函数

派生类的私有成员相同,都是一个前向类,和一个类指针

//ShapeInterface.h
//接口声明头文件#pragma once//在预编译器里添加 SHAPEINTERFACE_EXPORTS
//指定为导出模式,后面的类名前也都要添加 SHAPEINTERFACE_API
#ifdef SHAPEINTERFACE_EXPORTS
#define SHAPEINTERFACE_API __declspec(dllexport)
#else
#define SHAPEINTERFACE_API __declspec(dllimport)
#endif//声明基类
class SHAPEINTERFACE_API Shape {
public:virtual double getArea() = 0;//纯虚函数,以实现多态
};//派生类 Triangle
class SHAPEINTERFACE_API Triangle :public Shape {
public:Triangle(double a, double b, double c);double getArea();
private:class ShapePrivate;ShapePrivate* private_handler;
};class SHAPEINTERFACE_API Rectangle :public Shape {
public:Rectangle(double width, double height);double getArea();
private:class ShapePrivate;ShapePrivate* private_handler;};class SHAPEINTERFACE_API Circle :public Shape {
public:Circle(double radius);double getArea();
private:class ShapePrivate;ShapePrivate* private_handler;
};

2、接口实现文件

//ShapeTriangle.cpp
//三角形派生类的实现文件#include<iostream>
#include<math.h>
#include "ShapeInterface.h"
#define PI 3.14159
using namespace std;//对之前声明的前向类做定义
//把派生类的构造函数和成员函数在前向类中实现
//各个派生类相关的数据成员也在此声明
//其中area是每个派生类都有的数据成员,因为要返回面积
class Triangle::ShapePrivate {
public:double PrintArea() {double p = (a + b + c) / 2;this->area = sqrt(p * (p - a) * (p - b) * (p - c));return this->area;}ShapePrivate(double a, double b, double c) {this->a = a;this->b = b;this->c = c;}
public:double a, b, c;double area;};//定义构造函数,用类中类实现
Triangle::Triangle(double a, double b, double c) {private_handler = new ShapePrivate(a, b, c);
}double Triangle:: getArea() {return private_handler->PrintArea();
}
//ShapeRectangle.cpp
//长方形派生类的实现文件#include<iostream>
#include<math.h>
#include "ShapeInterface.h"
#define PI 3.14159
using namespace std;class Rectangle::ShapePrivate {
public:double PrintArea() {this->area = this->width * this->height;return this->area;}ShapePrivate(double width, double height) {this->width = width;this->height = height;}
public:double width;double height;double area;};Rectangle::Rectangle(double width, double height) {private_handler = new ShapePrivate(width, height);
}double Rectangle::getArea() {return private_handler->PrintArea();
}
//ShapeCircle.cpp
//圆形派生类的实现文件#include<iostream>
#include<math.h>
#include "ShapeInterface.h"
#define PI 3.14159
using namespace std;class Circle::ShapePrivate {
public:double PrintArea() {this->area = PI * radius * radius;return this->area;}ShapePrivate(double radius) {this->radius = radius;}
public:double radius;double area;};Circle::Circle(double radius) {private_handler = new ShapePrivate(radius);
}double Circle::getArea() {return private_handler->PrintArea();
}

3、生成dll/lib文件

若配置类型为exe,将其改为动态库

生成结果如下,有一个dll和lib

4、写个Demo验证一下

在解决方案中添加一个项目DemoProject

//Demo.cpp
//测试文件#include<iostream>
#include<math.h>
#include<ShapeInterface.h>
#define PI 3.14159
using namespace std;int main() {Shape* pTg = new Triangle(3.0, 4.0, 5.0);Shape* pRtg = new Rectangle(4.0, 5.0);Shape* pCle = new Circle(5.0);cout << "Area of Triangle is " << pTg->getArea() << endl;cout << "Area of Rectangle is " << pRtg->getArea() << endl;cout << "Area of Circle is " << pCle->getArea() << endl;system("pause");return 0;
}

配置一下DemoProject项目属性:

在包含目录里添加头文件路径,这里因为两个项目都在一个解决方案路径下, 所以我就写的是接口项目名的路径(这个下面有ShapeInterface.h)。假如是别人给你的头文件,你随便放在一个\a\b\c路径下的话,这里就应该包含\a\b\c路径以便找到头文件。

运行一下

C++:通过多态实现接口并生成dll和lib文件的小例子相关推荐

  1. 编译Gmsh,生成dll和lib文件,在自建程序中使用Gmsh函数

    本文参考了CAD大神潇湘散人的Gmsh编译博客:使用VS2015编译gmsh4.8 with opencascade7.4,并用gmsh.lib创建简单工程测试网格_XXM的博客-CSDN博客在编译过 ...

  2. Qt 编译动态库只生成dll没有lib文件

    背景描述: 库A开发最初是以静态库形式存在,随着时间推移项目功能逐渐增多,涉及库A的内容也增多.组内成员开发各有习惯,QtCreator和VS2015未作限制. 现象: VS2015编辑器下正常编译和 ...

  3. 一分钟详解VS中快速生成dll和lib方法

    视觉IMAX的第43篇文章 问题:如果我们在Visual Studio工程中,想要快速学习如何生成dll和lib,有什么小技巧呢? 方法:在VS工程中添加新项目,操作具体方法如图1.图2所示. 经过上 ...

  4. c++中.dll与.lib文件的生成与使用的详解

    c++中.dll与.lib文件的生成与使用的详解 --------------------------------------------------------------------------- ...

  5. .dll与.lib文件的区别

    文章转载于https://www.cnblogs.com/zkwarrior/p/10948174.html 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由 ...

  6. 怎么创建dllwenjian_如何创建和使用dll及lib文件

    Abstract 如何在VC9环境下创建和使用dll及lib文件,但不用MFC. 一.创建dll 参见文章[zz]lib和dll文件的区别和联系.用方法一,在VC9下测试通过. 创建一个Dynamic ...

  7. Gh0st源码学习(三)生成DLL和DAT文件

    从生成的EXE文件中分离出DLL和DAT 文件 一.自定义DLL和DAT文件的生成路径 先搜索 IDR_BSS . IDR_DLL   1. IDR_DLL   位置:\Gh0st3.6原版\Serv ...

  8. 由dll导出lib文件

    老生长谈的问题了,网上的教程也很多,这里以实际例子作个备份,并说明下注意点. 只有dll文件(my.test.dll)和头文件,没有lib文件,需要导出lib,静态编译进代码中,用VS自带的dumpb ...

  9. 生成句法分析树以及从一个小例子来看词义消歧及语义角色标注

    一.生成句法分析树 把一句话按照句法逻辑组织成一棵树,由人来做这件事是可行的,但是由机器来实现是不可思议的,然而算法世界就是这么神奇,把一个十分复杂的过程抽象成仅仅几步操作,甚至不足10行代码,就能让 ...

最新文章

  1. 您如何在PHP中解析和处理HTML / XML?
  2. linux安装无线电软件,基于Linux的软件无线电系统软件平台的研究与实现
  3. 实训C++语言设计——实现复数运算
  4. SQL Sever 子查询与嵌套查询
  5. 查找100 sql oracle,Oracle中SQL语句执行效率的查找与解决
  6. [scala-spark]12. RDD行动操作
  7. MySQL InnoDB 是如何存储数据的
  8. mac sierra 10.12部分注册机Special-K+CORE Keygen不能运行的问题
  9. 谁要是敢用Map传参数,我喵喵就打死他
  10. 力扣198. 打家jie舍(JavaScript)
  11. 华为的薪酬体系整体框架,值得收藏
  12. 谷歌不会退出中国市场的八大理由
  13. 金山WPS c++ 一面面经
  14. 基础命令和脚本练习初识
  15. 服务器c盘空间不够解决
  16. PDPS软件:PSZ格式文件的保存与打开方法
  17. 从linux启动到rootfs的挂载分析 https://blog.csdn.net/kevin_hcy/article/details/17663341
  18. I2S和I2C分别如何连接pad
  19. 采购标准订单/标准收货 AI U9配置
  20. 欧式距离和曼哈顿距离

热门文章

  1. Linux - Redis介绍以及安装 (简易版本)
  2. 如何导出树结构清晰的代码机构目录
  3. jeecg_framework_v2.1.0(20130123).rar 版本发布
  4. 虚拟机系列 | JVM类加载机制
  5. 本科,程序员,北京工作两年多,税后12k,出路在哪里?
  6. PL/Sql 中创建、调试、调用存储过程
  7. iOS之应用偏好设置
  8. Hibernate注解方式实现1-1双向关联
  9. 页面用ajax实现简单的连接数据库
  10. 批量部署Linux操作系统的一场革命----Cobbler