在上一篇博文中,举了一个简单的例子介绍了下.so文件的使用方法,现在举个例子来说明下如何用.so动态库来
实现面向对象的多态。
大致的思想如前一篇博文所说就是我们在头文件a.h中定义一个基类,基类中有一个虚函数(虚函数必须要有函数体,可以不用定义),在另外的a.cpp,b.pp,c.cpp中定义了该基类的一个子类并且在三个子类中分别重定义了
类中的虚函数实现了不同的功能,并且分别打包成了liba.so、libb.so、libc.so。然后我们定义一个main.cpp来分
别测试不同.so文件中实现的不同功能!
a.h:
#include
using namespace std;
class base
{
public:
virtual void hello(){}
};
base * get();//这个函数非常重要,因为我们需要通过来实现不同子类对象的返回!
a.cpp:
#include
#include
#include"a.h"
using namespace std;
class childa : public base
{
public:
void hello();
private:
string name;
};
void childa::hello()
{
name = "a";
cout<<"i am child a !!"<}
base* get()
{
base *p = new childa();
return p;
}
b.cpp:
#include
#include
#include"a.h"
using namespace std;
class childb : public base
{
public:
void hello();
private:
string name;
};
void childb::hello()
{
name = “b”;
cout<<"i am child b !!"<
}
base* get()
{
base *p = new childb();
return p;
}
c.cpp:
#include
#include
#include"a.h"
using namespace std;
class childc : public base
{
public:
void hello();
private:
string name;
};
void childb::hello()
{
name = “c”;
cout<<"i am child c !!"<
}
base* get()
{
base *p = new childc();
return p;
}
main.cpp
#include
#include"a.h"
using namespace std;
int main()
{
base *ss;
ss = get();
ss->hello();
return 0;
}
以上就是各个文件的定义,下面把每个子类打包成.so文件:
g++ a.cpp -fPIC -shared -o liba.so
g++ b.cpp -fPIC -shared -o libb.so
g++ c.cpp -fPIC -shared -o libc.so
分别测试执行:
g++ main.cpp -la -o main
./main
得到输出结果:“i am child a!!”。
同理可得到其他结果!这样我们就很好的实现了面向对象的多态性,以后我们在应用时候就不用关心子类的实现只需要用基类的指针来调用就可以实现不同的功能,在本例中最为重要的一步就是在头文件中定义了base * get();函数
通过该函数来分别取得不同子类的对象!!大家可以参考这种实现方式!!
阅读(1557) | 评论(0) | 转发(0) |