C++之多态篇

    

    1 多态:

        多态是指同样的消息被不同类型的对象接收时导致的不同行为。这里的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。在程序中经常遇到这样的情况,例如同样的“+”,就可以实现整型数之间,浮点数之间,双精度浮点数之间的运算。

    2 多态的类型:

    面向对象的多态性可以分为4类: 
专用多态: 
(1)重载多态:普通函数以及成员函数的重载。 
(2)强制多态:将一个变量的类型加以变化。 
通用多态: 
(3)包含多态:研究类族中定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现。 
(4)参数多态:与类模板相关联。(在虚函数中用到) 

     3 .多态的实现: 
多态从实现的角度可以分为: 
(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函数。






猜你喜欢

转载自blog.csdn.net/qq_39486027/article/details/80522642