首先什么是多态?
多态—->字面意思就是多种形态。在面向对象语言中,接口的多种不同实现方式即为多态!
在c++中也是如此,同一操作作用于不同的对象可以有不同的解释,有不同的结果。在运行时可以通过指向基类的指针,来调用实现派生类中的方法。
在c++中实现多态的方法:虚函数,抽象类,覆盖,模板(注意:重载和多态无关!)
对象类型:
例子:
静态分类:1,静态多态(函数重载,泛型编程)2,动态多态(虚函数)
静态多态例子:
int add(int left, int right)
{
return left + right;
}
float add(float left, float right)
{
return left + right;
}
int main()
{
cout << add(1, 2) << endl;
cout << add(1.1f, 2.2f) << endl;
system("pause");
return 0;
}
动态多态例子:(模拟实现10个人上厕所情景)
再给出该例子前我们先简单理解什么是重写。
class CWashRoom
{
public:
void GotoManWashRoom()
{
cout << "Man---->please left" << endl;
}
void GotoWomanWashRoom()
{
cout << "Woman--->please right" << endl;
}
};
class Person
{
public:
virtual void GotoWashRoom(CWashRoom&_washroom) = 0;
};
class man :public Person
{
public:
virtual void GotoWashRoom(CWashRoom&_washroom)
{
_washroom.GotoManWashRoom();
}
};
class woman :public Person
{
public:
virtual void GotoWashRoom(CWashRoom&_washroom)
{
_washroom.GotoWomanWashRoom();
}
};
void test()
{
CWashRoom washroom;//创建CWashRoom类的对象washroom
int i = 0;
for (i = 1; i <= 10; ++i)
{
Person* pperson;//创建person类指针,实现基类方法的调用
int iper = rand() % i;
if (iper & 0x01)
{
pperson = new man;
}
else
{
pperson = new woman;
}
pperson->GotoWashRoom(washroom);
delete pperson;
pperson = NULL;
Sleep(1000);
}
}
int main()
{
test();
system("pause");
return 0;
}
virtual:关键字修饰类成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将会实现动态绑定。
动态绑定的条件:
1,必须是虚函数
2,通过基类类型的引用或者指针调用虚函数
继承体系中同名函数的关系:
小结:
1,在继承的结构下,基类必须要有有虚函数,派生类中必须要对基类的虚函数进行重写,通过基类的指针或者引用访问。
2,构造函数不能作为虚函数。(1,因为创建对象时我们总要明确指定对象的类型,而虚函数实在程序运行期间确定实际类型的。当对象没有构造成功时,编译器无法知道对象实际类型是该类本身还是该类的派生类,或者更深层次的派生类。2,虚函数的执行依赖于虚函数表。而虚函数表实在构造函数中进行初始化工作的。构造对象时,虚函数表还没有被初始化。)
3,静态成员函数不能作为虚函数。(静态成员函数没有this指针)
4,赋值运算符不建议作为虚函数。