目录
一、权限修饰符
public:共有
protected:受保护
private:私有
使用
修饰成员(成员变量、成员方法)
注意
只改变作用域,不改变内存分配
修饰成员(成员变量、成员方法)和
public: 成员在任何位置可被访问
protected: 成员在当前类与派生类中可被访问
private: 成员在当前类中可被访问
二、友元
1、友元打破访问权限的限制,即让访问权限不生效
2、友元包括
类的友元C函数;
类的友元成员函数;
类的友元类,类的友元可以访问类中所有的成员(包括public、protedcted和private成员)
3、类的友元C函数就是在类中把普通的C函数用friend进行声明
4、类的友元成员函数就是在类中把另一个类的成员函数用friend进行声明
5、类的友元类就是在类中把另一个类用friend进行声明
三、继承与派生
1、继承与派生的概念
a、继承封装与多态是面向对象语言的核心思想
b、继承可以使面向对象语言代码重用
c、一个派生类只从一个基类派生,这称为单继承(single inheritance),这种继承关系所形成的层次是一个树形结构.
d、从多个基类派生。一个派生类有两个或多个基类的称为多重继承
2、派生类的声明
a、声明派生类的一般形式为
class 派生类名: [继承方式] 基类名1,....,[继承方式]基类名n { 派生类新增加的成员 } ;
b、继承方式包括: public、 privat、protected如果不写此项,则默认为private(私有的)。
c、单基继承
假设有A类, 然后让B类公有继承 A类
class B :public A { ...... };
d、多基继承
设置有A类、B类和C类, 让D类公有继承A类,私有继承B类,私有继承C类
class D :public A, protected B, private C { ...... } class D :public A, private B,private C { ...... }
3、派生类的构成
派生类中的成员包括从基类继承过来的成员和自已新增加的成员。 (成员指成员变量和成员函数)。
4、继承与权限修饰
- 派生类中的成员包括从基类继承过来的成员和自已新增加的成员。(成员指成员变量和成员函数)
- 基类中private修饰的成员始终不能被派生类继承
- 基类中public修饰的成员与受保护成员始终可以被派生类继承
public继承 | protected继承 | private继承 | |||||||
基类 | private | protected | public | private | protected | public | private | protected | public |
派生类 | protected | public | protected | protected | private | private |
private 修饰的成员,任何情况下都无法被派生类继承。
四、派生类的构造函数和析构函数
- 构造函数和析构函数都不能被继承
- 派生类对象被创建时,基类对象会被先创建
- 派生类的构造函数被调用时,会先调用基类的其中一个构造函数
- 派生类的构造函数中用了初始化表的方式调用了基类构造函数,默认不写时是调用了基类中可以不传参数的构造函数
- 在派生类对象释放时,先执行派生类析构函数,再执行基类析构函数
五、继承的二义性(三角形)
1、多基继承的二义性
如果已声明了类A1、类A2,再让B继承A1与A2。
如果A1与A2中同名字的成员,并且都被B继承下去了,些时使用B的对象访 问同名字的成员会产生二义性。
2、共同基类产生的二义性(菱形)
class B1: public A{......};
class B2: public A{......};
class C: public B1,public B2 {......};
3、共同基类产生的二义性的解决办法——虚基派生
相同的属性被合并。
六、基类与派生类的转换
1、基类与派生类的转换
a、基类声明的指针变量和引用类型变量可以指向派生类的对象。
class B:public A {.........};
B b;
A *pa = &b;
A &ra = b;
b、当使用对象的指针变量去访问对象的成员时,能访问到的成员只有从指针所属类中的继 承下来的成员
c、当使用对象的引用类型变量去访问对象的成员时,能访问到的成员只有从引用类型变量 所属类中继承下来的成员
(只看类型,不看对象)
d、派生类对象可以向基类对象赋值
class A {
public:
int x;
int y;
void show();
};
class B :public A {
public:
int z;
};
int main() {
A a; //x, y
a.x = 1;
a.y = 2;
B b; //x, y, z
b.x = 10;
b.y = 20;
b.z = 30;
//派生类对象向基类对象赋值
a = b; //a.x = b.x; a.y = b.y;
}
//派生类对象为基类对象赋值,则b对象中的x,y的值会赋值给a对象的x和y, 因为z在a对象中不存在,所以不会有z的赋值。
a = b;