Chinaunix首页 | 论坛 | 博客
  • 博客访问: 671201
  • 博文数量: 150
  • 博客积分: 4070
  • 博客等级: 中校
  • 技术积分: 1795
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-23 21:44
文章分类

全部博文(150)

文章存档

2012年(1)

2011年(123)

2010年(26)

分类: C/C++

2011-06-19 21:09:23

一、多态性
1、多态考虑在不同层次的类中,以及一个类的内部,同名成员函数之间的关系问题,解决功能和行为的在抽象问题。直观来讲,多态是指类族中具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的函数。
 
2、多态性可以分为:重载多态;强制多态;包含多态;参数多态。
   包含多态是研究类族中定义于不同类中的同名成员函数的多态行为,主要是通过虚函数来实现。
   参数多态与类模板相关联。
 
3、多态的实现:编译时的多态和运行时的多态。
 
二、运算符重载
1、运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。实质是函数重载。
 
2、运算符重载规则:
   只能重载已存在的运算符(还有".",“*”,“::”,“sizeof”, “? :”不能被重载);
   重载后优先级和结合性不能改变。
 
3、运算符可以重载为类的成员函数或重载为友元函数。语法分别为:
   函数类型 operator 运算符(形参表)
   {
       函数体;
   }
或 friend 函数类型 operator 运算符(形参表)
   {
       函数体;
   }
例子:复数类加减法——双目运算符重载为成员函数
  1. #include <iostream>
  2. #include <time.h>
  3. using namespace std;

  4. class complex
  5. {
  6. public:
  7.     complex(double r = 0.0, double i = 0.0)
  8.     {
  9.         real = r;
  10.         imag = i;
  11.     }
  12.     complex operator +(complex c2);
  13.     complex operator -(complex c2);
  14.     void display();
  15. private:
  16.     double real; //实部
  17.     double imag; //虚部
  18. };

  19. complex complex::operator +(complex c2)
  20. {
  21.     return complex(real+c2.real, imag + c2.imag);    //创建无名对象返回
  22. }

  23. complex complex::operator -(complex c2)
  24. {
  25.     return complex(real-c2.real, imag - c2.imag);   //创建无名对象返回
  26. }

  27. void complex::display()
  28. {
  29.     cout<<"("<<real<<","<<imag<<")"<<endl;
  30. }

  31. int main()
  32. {
  33.     complex c1(5,4), c2(2,10), c3;
  34.     cout<<"c1 = ";
  35.     c1.display();
  36.     cout<<"c2 = ";
  37.     c2.display();
  38.     c3 = c1 - c2;
  39.     cout<<"c3 = c1 - c2 = ";
  40.     c3.display();
  41.     c3 = c1 + c2;
  42.     cout<<"c3 = c1 + c2 = ";
  43.     c3.display();

  44.     return 0;
  45. }

例子:单目运算符重载为成员函数

将单目运算符重载为成员函数,则需要使用参数,但是对于单目运算符++,--,对于前置单目运算法,函数重载没有形参,后置单目运算符,重载函数有一个整形形参。

例子:复数类加减法——运算符重载为友元函数

  1. #include <iostream>
  2. #include <time.h>
  3. using namespace std;

  4. class complex;
  5. complex operator +(complex c1, complex c2);
  6. complex operator -(complex c1, complex c2);

  7. class complex
  8. {
  9. public:
  10.     complex(double r = 0.0, double i = 0.0)
  11.     {
  12.         real = r;
  13.         imag = i;
  14.     }
  15.     friend complex operator +(complex c1, complex c2); //友元函数
  16.     friend complex operator -(complex c1, complex c2); //友元函数
  17.     void display();
  18. private:
  19.     double real; //实部
  20.     double imag; //虚部
  21. };

  22.  complex operator +(complex c1, complex c2)
  23. {
  24.     return complex(c1.real+c2.real, c1.imag + c2.imag);
  25. }

  26. complex operator -(complex c1, complex c2)
  27. {
  28.     return complex(c1.real-c2.real, c1.imag - c2.imag);
  29. }

  30. void complex::display()
  31. {
  32.     cout<<"("<<real<<","<<imag<<")"<<endl;
  33. }

  34. int main()
  35. {
  36.     complex c1(5,4), c2(2,10), c3;
  37.     cout<<"c1 = ";
  38.     c1.display();
  39.     cout<<"c2 = ";
  40.     c2.display();
  41.     c3 = c1 - c2;
  42.     cout<<"c3 = c1 - c2 = ";
  43.     c3.display();
  44.     c3 = c1 + c2;
  45.     cout<<"c3 = c1 + c2 = ";
  46.     c3.display();

  47.     return 0;
  48. }

三、虚函数

1、虚函数是动态联编的,虚函数是非静态的成员函数,虚函数经过派生之后,在类族中就可以实现运行过程中的多态。

2、如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员(如果是函数,其原型完全相同),那么首先在基类中将这个同名函数说明为虚函数。通过基类类型的指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现运行时的多态,

3、语法:

virtual 函数类型 函数名(形参表)

{

    函数体;

}

虚函数必须在声明时出现virtual,在定义时指定不是现实虚函数。

4、运行多态需要满足的条件:类之间应满足赋值兼容规则;声明虚函数;要由成员函数来调用或者是通过指针、引用来访问虚函数。如果使用对象来访问虚函数,则联编在编译过程中就可以进行(静态联编),而无需在运行过程中进行。

5、例子

  1. #include <iostream>
  2. #include <time.h>
  3. using namespace std;

  4. class B0
  5. {
  6. public:
  7.     virtual void display()
  8.     {
  9.         cout<<"B0::display()"<<endl;
  10.     }
  11. };

  12. class B1:public B0
  13. {
  14. public:
  15.     void display()
  16.     {
  17.         cout<<"B1::display()"<<endl;
  18.     }
  19. };

  20. class B2:public B0
  21. {
  22. public:
  23.     void display()
  24.     {
  25.         cout<<"B2::display()"<<endl;
  26.     }
  27. };

  28. void fun(B0 *ptr)
  29. {
  30.     ptr->display();
  31. }

  32. int main()
  33. {
  34.     B0 b0, *p;
  35.     B1 b1;
  36.     B2 b2;
  37.     fun(&b0);
  38.     p = &b1;
  39.     fun(p);
  40.     p = &b2;
  41.     fun(p);

  42.     return 0;
  43. }

输出结果:

B0::display()

B1::display()

B2::display()

6、虚析构函数:C++中不能声明虚构造函数,但能声明虚析构函数。

四、抽象类

1、抽象类是一种特殊的类,它为一族类提供统一的操作界面。建立抽象类,就是为了通过它多态地使用其中的成员函数。一个抽象类自身无法实例化,即无法声明一个抽象类的对象,但可以声明一个抽象类的指针和引用。抽象类是带有纯虚函数的类。

2、纯虚函数

   纯虚函数是一个基类中说明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。语法为:

virtual 函数类型 函数名(参数表)= 0;

阅读(652) | 评论(0) | 转发(0) |
0

上一篇:类的继承与派生

下一篇:重载 覆盖 隐藏

给主人留下些什么吧!~~