Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105072
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-02-22 23:35:18

今天把类说完。剩下的就是继承,多态了。

1. 继承
做一个类不容易,新做一个类,需要用到它的东西,不重复利用可惜了。那就继承吧。继承是类的一大特性,解决了很多事。
如何继承?

class derived_class_name: public base_class_name {};

就是用:public连接基类就可以了。这里的public说的是继承基类的公共成员和保护成员作为自己的公共成员和保护成员。public也可以被private, protected代替。那意思就不一样了。:private意思就是基类的公共成员和保护成员将成为派生类的私有成员,也就是说派生类的的子类就不能继承它了。:protected 意思就是接列的公共成员和保护成员将成为派生类的的保护成员,能够陪派生类的子类以及友元函数继承。

如果没有说明,默认的情况是,对"class"采取private,对"struct"采取public。

 继承了什么?
除了下面的,都继承。
构造函数和析构函数
operator=()成员
友元函数

什么是多元继承?

你继承一个是继承,需要的话,继承两个是也继承。三个,四个也可以,你看着办。格式:
class derived_class_name: public base1_class_name, protected base2_class_name;

2. 多态
要么说C++灵活呢,能继承,还能呈现不同的态。继承就想基因,儿子总有老子的一些特点。当然儿子也自己的特色了(自己定义成员)。多态呢,就像是都儿子,同一个基因,表达不同了。

2.1 指向基类的指针
派生类有个特性,就是指向派生类的指针和指向基类的指针的类型是相容的。举个例子。
  1. #include <iostream>
  2. using namespace std;

  3. class Cpolygon {

  4.    protected:
  5.    int width, height;
  6.    public:
  7.    void set_values (int a, int b)
  8.    {width = a; height = b;}
  9. };

  10. class Crectangle: public Cpolygon {

  11.    public:
  12.    int area () {
  13.     return (width*height);
  14.    }
  15. };

  16. class Ctriangle: public Cpolygon {

  17.    public:
  18.    int area () {
  19.     return (width*height/2);
  20.    }
  21. };

  22. int main () {

  23.    Crectangle rect;
  24.    Ctriangle trgl;
  25.    Cpolygon *ppoly1 = &rect;                 //pointer to base class, but store the address of object rect
  26.    Cpolygon *ppoly2 = &trgl;

  27.   ppoly1->set_values (3,4);
  28.   ppoly2->set_values (3,4);
  29.   cout<<rect.area()<<endl;
  30.   cout<<trgl.area()<<endl;

  31.   return 0;

  32. }
看都没有?指针ppoly1存的是对象rect,为什么可以呢?因为它们都来自Cpolygon。
cout<<rect.area()<<endl;
cout<<trgl.area()<<endl;
这是什么意思呢?基类中没有定义函数area,所以要这样写。如果基类中定义了函数area,那又不是谁都合适。所以才有了虚函数。
 
2.1 虚成员
上面说了,虚函数是为了多态而来的。如何声明呢?
virtual type function_name () {}

也就是说,需要关键字virtual作特别声明。

虚函数的执行语句怎么写?
以上面的例子为例
virtual int area () {return (0);}

一个类声明了或者继承了一个虚函数就可以称为多态类。

抽象基类
这个好玩吧,抽象。什么是抽象?抽象就是没有实质内容。玩虚的。
就是类中的成员是没有执行语句的,或者里面有纯虚函数。
什么是纯虚函数?
上面的需函数如果写成下面这样,就是了。
virtual int area () = 0;
virtual int area (void) = 0;

这就有个问题,这个类能干什么?什么都能干,就是不能实例化。都是虚的怎么实例化。
可是你能够派生出很多类,这些类,你可以随便定义这些函数。做不同的事情。
抽象类的子类也可以是抽象类(添加更多的虚成员)。
说白了,抽象类就是个接口。

说完类了,我挺多的,现在觉得有点不想写了,可是不能半途而废。我还是会写完接下来的。也不多了。

阅读(1268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~