c++/oop---继承与派生
c++/oop---继承与派生
继承:在定义一个新的类 B 时,如果该类与某个已有的类 A 相似 (指的是 B 拥有 A 的全部特点),
那么就可以把 A 作为一个基类,而把 B 作为基类的一个派生类 (也称子类)。
逻辑:B对象也是一个A对象
例 :
查看代码
#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class MyString:public string
{
public:
MyString (){}
MyString (char * ch):string(ch){}
MyString (string s):string(s){}
string operator ()(int l,int len){
return substr(l,len);
}
};
int main()
{
MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);
MyString SArray[4] = {"big","me","about","take"};
cout << "1. " << s1 << s2 << s3<< s4<< endl;
s4 = s3;
s3 = s1 + s3;
cout << "2. " << s1 << endl;
cout << "3. " << s2 << endl;
cout << "4. " << s3 << endl;
cout << "5. " << s4 << endl;
cout << "6. " << s1[2] << endl;
s2 = s1;
s1 = "ijkl-";
s1[2] = 'A' ;
cout << "7. " << s2 << endl;
cout << "8. " << s1 << endl;
s1 += "mnop";
cout << "9. " << s1 << endl;
s4 = "qrst-" + s2;
cout << "10. " << s4 << endl;
s1 = s2 + s4 + " uvw " + "xyz";
cout << "11. " << s1 << endl;
sort(SArray,SArray+4);
for( int i = 0;i < 4;i ++ )
cout << SArray[i] << endl;
//s1的从下标0开始长度为4的子串
cout << s1(0,4) << endl;
//s1的从下标5开始长度为10的子串
cout << s1(5,10) << endl;
return 0;
}
这段代码很好的体现了继承的特点:
所有 string 的功能,Mystring都继承好了
C++中,派生类的对象可以赋值给基类对象,因为,一个派生
类对象,也可看作是一个基类对象(大学生是学生)。反过来则不行(学生未
必是大学生) 同样,调用需要基类对象作参数的函数时,以派生类对象作为实参,也是没有问题的
派生类是通过对基类进行修改和扩充得到的。
扩充: 在派生类中,可以添加新的成员变量和成员函数
修改: 在派生类中,可以重新编写从基类继承得到的成员
派生类一经定义后,可以独立使用,不依赖于基类。
写法:
class 派生类名:派生方式说明符 基类名
eg. class CDerive: public CBase{
}
派生类中可以定义于基类重名的函数,叫做覆盖。
调用的时候默认调用派生类中的函数,基类的话要加 CBase ::
先定义另一种存取权限说明符: protected
基类的 private 成员:可以被下列函数访问
基类的成员函数
基类的友元函数
基类的 public 成员:可以被下列函数访问
所有函数
基类的 protected 成员:可以被下列函数访问
基类的成员函数
基类的友元函数
派生类的成员函数
派生类的友元函数
派生方式
公有继承 (public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,
而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
私有继承 (private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
保护继承 (protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,
基类的私有成员仍然是私有的。
1基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。
2 基类成员对派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。这里保护成员同于
公有成员。
3 基类成员对派生类对象的可见性:
公有成员可见,其他成员不可见。
1基类成员对其对象的可见性:
公有成员可见,其他成员不可见。
2 基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。
3 基类成员对派生类对象的可见性:
所有成员都是不可见的。
基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。
2 基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。
3 基类成员对派生类对象的可见性:
所有成员都是不可见的。 (完全同私有继承)
派生类对象的大小,等于基类对象的大小,再加上派生类对象自己的成
员变量的大小。在派生类对象中,包含着基类对象,而且基类对象的存
储位置位于派生类对象新增的成员变量之前。
派生类的构造函数
FlyBug::FlyBug (int legs, int color, int wings):Bug(legs, color) {
nType = 1;
nWings = wings;
}
调用 Bug 的构造函数
如果省略,则会自动调用基类的默认的构造函数
派生类的析构函数调用后会自动调用基类的析构函数
public 继承的赋值兼容规则 :派生类就是基类
派生类的对象可以赋值给基类对象
派生类对象可以初始化基类引用
派生类对象的地址可以赋值给基类指针
只有public可以!可以近似的把派生类看成基类
公有派生的情况下, 派生类对象的指针可以直接赋值给基类指针
不能通过 ptrBase 访问 objDerived 对象中属于 Derived 类而不属于
Base 类的成员
通过强制指针类型转换,可以把 ptrBase 转换成 Derived 类的指针