C语言实现
/*************************************************************************
> File Name: prototype.c
> Author: XXDK
> Email: v.manstein@qq.com
> Created Time: Mon 10 Sep 2018 05:52:03 PM CST
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
typedef struct _Data
{
struct _Data* (*copy) (struct _Data* pData);
int data;
}Data;
Data* data_copy_A(Data* pData)
{
Data* pResult = (Data*)malloc(sizeof(Data));
assert(NULL != pResult);
memmove(pResult, pData, sizeof(Data));
return pResult;
}
Data data_A = {
data_copy_A,
2
};
Data* clone(Data* pData)
{
return pData->copy(pData);
}
int main()
{
Data* data_B = clone(&data_A);
printf("Data.data = %d\n", data_B->data);
return 0;
}
C++实现
/*************************************************************************
> File Name: prototype.cpp
> Author: XXDK
> Email: v.manstein@qq.com
> Created Time: Mon 10 Sep 2018 05:28:17 PM CST
************************************************************************/
#include<iostream>
using namespace std;
class Data
{
public:
Data() {}
virtual ~Data() {}
virtual Data* copy() = 0;
};
class DataA : public Data
{
public:
DataA() {}
virtual ~DataA() {}
Data* copy() override {
std::cout << typeid(DataA).name()<<"::" << __func__<< std::endl;
return new DataA();
}
};
class DataB : public Data
{
public:
DataB() {}
virtual ~DataB() {}
Data* copy() override {
std::cout << typeid(DataB).name() << "::"<<__func__ << std::endl;
return new DataB();
}
};
Data* clone(Data* pData)
{
return pData->copy();
}
int main()
{
Data* pa = new DataA();
Data* p1 = clone(pa);
Data* pb = new DataB();
Data* p2 = clone(pb);
delete pa, pb, p1, p2;
}