2004-11-15 11:00 PM
总结C++,类的继承、包括对虚函数的使用都是重要的内容。甚至可以说它们是C++编程的一个缩影。个人认为关于这些理论是值得回顾的。随时&随地。
首先,是继承。这个概念很好的体现面向对象编程的概念。一个新的类型继承了已存在的类型的属性和行为,并且为了使新类型具有自己所需要的功能。而继承真正的魅力在于能够添加基类所没有的特点以及取代和改进从基类那里继承来的特点。
先谈谈理论的东西,C++提供了3种继承方式,用图表来说明应该简单一点
类成员变量的 访问说明符 | 继承类型 | ||
| Public继承 | Protected继承 | Private继承 |
Public | 在派生类中为public 可以直接由任何非static 成员函数、友元函数和 非成员函数访问 | 在派生类中为protected
可以直接由任何非static 成员函数、友元函数访问 | 在派生类中为private
可以直接由任何非static 成员函数和友元函数访问 |
Protected | 在派生类中为protected 可以直接由任何非static 成员函数和友元函数访问 | 在派生类中为protected 可以直接由任何非static 成员函数和友元函数访问 | 在派生类中为private 可以直接由任何非static 成员函数和友元函数访问 |
Private | 在派生类中隐藏 可以通过基类的public 或protected成员函数 由非static成员函数和 友元函数访问 | 在派生类中隐藏 可以通过基类的public 或protected成员函数 由非static成员函数和 友元函数访问 | 在派生类中隐藏 可以通过基类的public 或protected成员函数 由非static成员函数和 友元函数访问 |
根据上面表格里面的内容,我们可以按照自己的需求,作出相应的组合。
在public继承中,可以把一个派生类的对象作为它的基类对象来进行处理,另外,也可以把一个基类对象的指针强制转换成派生类指针,不过,必须首先确保它一定是指向某个派生类对象的;如果把指向基类对象的指针显式的转换成派生类指针以后,引用该对象中并不存在的派生类的成员会导致运行时的逻辑错误。
由于派生类继承了基类的成员,所以在建立派生类的实例对象时,必须调用基类的构造函数来初始化派生类对象的基类成员。派生类的构造函数既可以隐式的调用基类的构造函数,也可以在派生类的构造函数通过给基类提供初始化值显式的调用基类的构造函数。派生类不继承基类的构造函数和赋值运算符,但是派生类构造函数和赋值运算符能够调用基类的构造函数和赋值运算符。派生类的构造函数总是先调用其基类构造函数来初始化派生类中的基类成员。如果省略了派生类的构造函数,那么就由派生类的默认构造函数调用基类的默认构造函数。析构函数的调用顺序和构造函数的调用顺序是相反的,因此派生类的析构函数在基类的析构函数之前调用。
在public继承中,因为派生类对象也是基类对象,所以指向派生类对象的指针可以隐式的转换为指向基类对象的指针。基类指针和派生类指针与基类对象和派生类对象的混合和匹配有如下4种可能的方式:
1、 直接用基类指针引用基类的对象。
2、 直接用派生类指针引用派生类对象。
3、 用基类指针引用一个派生类对象。由于派生类的对象也是基类的对象,所以这种引用方式是安全的,但是用这种方法只能引用基类成员,如果试图通过基类指针引用那些只有在派生类中才有的成员,语法错误。
4、 用派生类的指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针。
多重继承,意味着一个派生类可以继承多个基类的成员。
2004-11-16 6:00 AM
本来打算在昨天完成的工作,因为同学的突然来访,只好被推迟了。
C++中有一种抽象类型,它是不能被实例化成任何对象的,它唯一的用途就是为其他类提供合适的基类,其他类可以从这里继承实现接口。所以,平时也称呼抽象类为接口。实际上在C++中是没有接口这个概念,在java等面向对象编程语言中是有的,不过没有关系,本质上是一样的。抽象类的表现是包含有一个纯虚函数。