1 多态:
多态是指同样的消息被不同类型的对象接收时导致的不同行为。这里的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。在程序中经常遇到这样的情况,例如同样的“+”,就可以实现整型数之间,浮点数之间,双精度浮点数之间的运算。
2 多态的类型:
面向对象的多态性可以分为4类:
专用多态:
(1)重载多态:普通函数以及成员函数的重载。
(2)强制多态:将一个变量的类型加以变化。
通用多态:
(3)包含多态:研究类族中定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现。
(4)参数多态:与类模板相关联。(在虚函数中用到)
多态从实现的角度可以分为:
(1)编译时的多态:静态联编(重载、强制、参数),程序编译连接阶段完成。
(2)运行时的多态:动态联编(包含),程序运行阶段完成。
其中运算符重载是函数的重载,属于多态的基础;用一句话描述运算符重载就是:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
简述一下运算符重载的规则:
- 除了少数几个(类属关系运算符“.”;成员指针运算符“*”;作用域分辨符“::”和三目运算符“?:”)不能重载,其他全部可以重载
- 重载后的优先级和结合性不变
下面给出一个+重载例子:
class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real=0,double imag=0)
{
this->real=real;
this->imag=imag;
}
Complex operator+(int x);
};
Complex Complex::operator+(int x)
{
return Complex(real+x,imag);
}
int main()
{
Complex com1(5,10),total;
total=com1+5;
return0;
}
当中还可以为了避免引进参数等问题:可以设置成友元函数。
当然多态的一个重要的知识点就是虚函数这块,下面介绍虚函数。
4.虚函数的介绍:
比如说你有一个基类BASE,有一个派生类Derived继承自BASE
两个类都有一个叫做fun的方法
然后你创建一个子类对象,但是用父类的指针(或者引用)指向他
例如:
class Base1{ //基类Base1定义
public:
virtual void dispaly() const;
};
void Base1::display() const{
cout<<"Base::display()"<<endl;
}
class Derived :Base1{
public:
void dispaly() const;
};
void Derived::display() const{
cout<<"Derived::display()"<<endl;
}
void fun(Base *ptr){
ptr->display();
}
int main()
{
Base1 base1; //定义Base1类对象
Derived derived; // 定义Derived对象
fun(&base1); //用base1对象的指针调用 fun函数
fun(&derived); //用derived对象的指针吊桶fun函数
return 0;
}
结果:
Base1::display()
Derived::display()
两个类都有一个叫做fun的方法,然后你创建一个子类对象,但是用父类的指针(或者引用)指向他
如果你不加 virtual,那么b.fun()调用的是父类的fun。因为b是父类指针,只能调用父类的方法,调用不到子类的方法。
如果你加上 virtual,那么b.fun()调用的是子类的fun。因为加了virtual之后,会产生一个虚表,将fun函数放入虚表之内。当创建一个子类对象时,会自动“覆盖”父类的fun函数(你暂时这么理解就行)。b.fun()调用的是子类覆盖之后的fun函数。