C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法

CMakeLists.txt

project(virtual) # 创建工程 virtual

add_library(virtual SHARED virtual.cpp) # 创建动态连接库 libvirtual.dll

add_executable(main main.cpp) # 创建运行程序 main.exe

target_link_libraries(main virtual) # 让 main.exe 连接 libvirtual.dll

virtual.h

#pragma once // 只编译一次

#ifndef VIRTUAL_VIRTUAL_H // 头文件定义
#define VIRTUAL_VIRTUAL_H
#endif

#ifdef BUILD_VIRTUAL_DLL // 导入导出标志,使其在 DLL 定义时声明为导出,再 DLL 调用时声明为导入
#define IO_VIRTUAL_DLL __declspec(export) // 导出定义
#else
#define IO_VIRTUAL_DLL __declspec(import) // 导入定义
#endif

extern "C" // 标准 C 格式,防止导出函数名变化
{
IO_VIRTUAL_DLL char *hello(char *pChar); // 导出函数 hello
}

virtual.cpp

#define BUILD_VIRTUAL_DLL // 声明为导出

#include "virtual.h" // 包含头文件

class Base // 纯虚函数基类
{
public:
    virtual char *hello(char *pChar) = 0;
};

class Derived : public Base // 纯虚函数继承类
{
public:
    char *hello(char *pChar);
};

char *Derived::hello(char *pChar) // 继承类需写函数体,否则仍为纯虚类
{
    return pChar;
}

IO_VIRTUAL_DLL char *hello(char *pChar) // 导出函数定义,函数头为头文件导出名,函数体调用纯虚类以实例化
{
    Base *pClass; // 声明基类指针
    pClass = new Derived(); // 指针初始化继承类
    pClass->hello(pChar); // 实例化
}

main.cpp

#include "virtual.h"
#pragma comment(a, "C:\Users\Perelman\.CLion2016.1\system\cmake\generated\virtual-24998182\24998182\Debug\libvirtual.dll.a")
#include <iostream>
using namespace std;
int main()
{
    cout << hello("Hello world!\n") << endl;
    return 0;
}

virtual.py

import ctypes
hDLL = ctypes.CDLL("C:\\Users\\Perelman\\.CLion2016.1\\system\\cmake\\generated\\virtual-24998182\\24998182\\Debug\\libvirtual.dll")
hDLL.hello.argtype = ctypes.c_char_p()
# hDLL.hello.restype = ? ‘‘‘ctypes 对指针返回值有些无力啊,无法返回指针指向的字符串‘‘‘
print("\n", hDLL.hello("Hello world!\n"), "\n")

时间: 2024-11-08 08:09:20

C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法的相关文章

Linux常用C函数-接口处理篇(网络通信函数)

接口处理篇accept,bind,connect,endprotoent,endservent,getsockopt,htonl,htons,inet_addr,inet_aton,inet_ntoa,listen,ntohl,ntohs,recv,recvfrom,recvmsg,send,sendmsg,sendto,setprotoent,setservent,setsockopt,shutdown,socket, accept(接受socket连线) 相关函数 socket,bind,l

C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针类型来判断的).纯虚函数是一种在父函数中只定义而不实现的一种函数,不能用来声明对象,也可以被称为抽象类.纯虚函数的实现也可以在类声明外进行定义.C++中的抽象类abstract class是指至少有一个纯虚函数的类,如果一个类全部由纯虚函数组成,不包括任何的实现,被称为纯虚类. Java中的普通函数

Java 8 函数接口详细教程

ay = new byte[array.length]; for (int i = 0; i < array.length; i++) { transformedArray[i] = function.applyAsByte(array[i]); } return transformedArray;}1234567这里测试如何实现short数组至byte数组乘以2的转换: short[] array = {(short) 1, (short) 2, (short) 3};byte[] trans

虚函数、纯虚函数和接口的实用方法和意义

从理论上来说,这三个概念很容易背的滚瓜烂熟,但是从大学毕业到现在,我都没真正搞明白这三个东西的出现,究竟是为了做到什么事情. 也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 知道后来我才慢慢了解,这些概念的出现,完全就不是为了编程的功能实现,而是编程的易用和扩展,准确的来说是方便再次开发而提出的一种标准而

C++ 虚函数 、纯虚函数、接口的实用方法和意义

也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 回过头来讲,让我了解标题这三个概念的实际用处,还是在于我这第四次重写毕业论文的代码,将它改写成面向对象的时候,才理解的.在面向对象设计的过程中, 类是从抽象逐渐具体起来的,父类可以是非常非常抽象的东西,而最终实例化的子类就非常具体了.在这个继承的过程中,不断

C++ 虚函数&amp;纯虚函数&amp;抽象类&amp;接口&amp;虚基类(转)

http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1

虚函数/纯虚函数/抽象类/接口/虚基类

1.多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 在Java中,没有指针,就直接用父类实例化子类对象 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的,多态可以让父类的指针有“多种形态”,这是一种泛型技术. 所谓泛型技术,就是试图使用不变的代码来实现可变的算法 2.虚函数 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){ 函数

虚函数、纯虚函数、抽象类、接口 (Java_C++_C#)

在OOP编程语言中,多态是很重要的OOP思想.而多态的语法支持离不开虚函数.每次都把什么虚函数,抽象类搞混,这次好好整理下! -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C++:抽象基类和纯虚函数的理解

转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义: 称带有纯虚函数的类为抽象类. ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作.所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些