本博客解决 如下几个问题!!!
第一:什么是多态?
第二:传统方法怎么实现多态?
第三:是否有新的方法实现多态?
什么是多态?
多态:多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征(引自百度百科)。
通俗解释:就是同一种实体,按道理来说,仅仅能表明一种状态。但是通过技术手段,让其可以表示多种状态,这就是多态!!!举个栗子
【例子】
编程角度解释:一个接口,多种实现。
传统方法怎么实现多态?
答: 实现多态的传统方法是通过继承体系。
有三个必要条件:
- 父类指针指向子类对象
- 子类要重写父类的方法
- 要有继承关系
下面给出具体代码实现:
class CFather
{
public:
virtual ~CFather() {};
virtual void saySomething()
{
std::cout << "I am Father!" << std::endl;
}
};
class CSon : public CFather
{
public:
virtual ~CSon() {};
virtual void saySomething() override
{
std::cout << "I am Son" << std::endl;
}
};
class CDaughter : public CFather
{
public:
virtual ~CDaughter() {};
virtual void saySomething() override
{
std::cout << "I am Daughter" << std::endl;
}
};
void main()
{
CFather* father;
CSon* son = new CSon;
CDaughter* daughter = new CDaughter;
father = son;
father->saySomething();
father = daughter;
father->saySomething();
delete son;
delete daughter;
system("pause");
}
解释:
角度1:代码中father是一个实体,father指向son对象,表现为一种状态(调用son的saySomething),当father指向daughter对象时,表现为一种状态(调用daughter的saySomething)。即一种实体,多种状态
角度2:saySomething算是一个接口,但是调用的时候,运行出来的结果时不同的,也即一个接口,多种实现
是否有新的方法实现多态?
答案是肯定的!!!boost库的boost::function 和boost::bind结合使用,可以实现多态。而且现在这中方法已经添加到STL中,std::function 和 std::bind。
如果不了解std::function 和 std::bind可以通过下面链接学习一下。
bind
function
请注意上面所说的多态的解释:一个接口,多种实现。然后再来看代码。
class CFather
{
public:
virtual ~CFather() {};
virtual void saySomething()
{
std::cout << "I am Father!" << std::endl;
}
};
class CSon : public CFather
{
public:
virtual ~CSon() {};
virtual void saySomething() override
{
std::cout << "I am Son" << std::endl;
}
};
class CDaughter : public CFather
{
public:
virtual ~CDaughter() {};
virtual void saySomething() override
{
std::cout << "I am Daughter" << std::endl;
}
};
void functionBind()
{
std::cout << "I am functionBind" << std::endl;
};
void main()
{
std::function<void()> function;
/*CFather* father;*/
CSon* son = new CSon;
CDaughter* daughter = new CDaughter;
//取代传统的多态实现方式
/*father = son;
father->saySomething();*/
function = std::bind(&CSon::saySomething, son);
function();
//取代传统的多态实现方式
/*father = daughter;
father->saySomething();*/
function = std::bind(&CDaughter::saySomething, daughter);
function();
delete son;
delete daughter;
system("pause");
}
对于上面的代码,一个接口就是指:std::function<void()> function;
,多种实现就是指通过使用std::bind( , );
将不同实现的函数绑定到同一个接口。因此,可是使用std::function
和 std::bind
想结合实现多态。