C++中抽象类是带一个或者多个纯虚函数的类,纯虚函数没有函数体。
接口基础:一组定义了参数和返回类型,没有实现的函数。
在客户端,客户使用的是接口指针,而不是具体的类指针。
实例:
DLL.dll
// CreditVerification.h
#pragma once
#ifdef _DLL
#define DLLSPEC __declspec (dllexport)
#else
#define DLLSPEC __declspec (dllimport)
#endif
struct ICreditVerification
{
virtual void SetCardType(char* s) = 0;
virtual bool VerifyCardNumber(long n) = 0;
};
DLLSPEC ICreditVerification* GetCreditVerificationObject();
// CreditVerification.cpp
#define _DLL
#include "creditverification.h"
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
class CCreditVerification : public ICreditVerification
{
private:
enum CardType {Visa, MasterCard, Amex} m_type;
public:
void SetCardType(char* s)
{
if (0 == strcmp("Visa", s))
m_type = Visa;
else if (0 == strcmp("MasterCard", s))
m_type = MasterCard;
else m_type = Amex;
}
bool VerifyCardNumber(long n)
{
if (m_type == Visa)
return (n % 2);
else if (m_type == MasterCard)
return (n % 3);
else if (m_type == Amex)
return (n % 5);
else return false;
}
};
DLLSPEC ICreditVerification* GetCreditVerificationObject()
{
return new CCreditVerification;
}
DLLTest.exe
// Test.cpp
#include "CreditVerification.h"
#include <windows.h>
#include <tchar.h>
#pragma comment(lib,"DLL.lib")
int _tmain(int argc, _TCHAR* argv[])
{
ICreditVerification* c = GetCreditVerificationObject();
c->SetCardType("MasterCard");
if (c->VerifyCardNumber(1234))
MessageBox(0, "Card Verified", "OK", 0);
else
MessageBox(0, "Card Rejected", 0, 0);
return 0;
}