一、类与类的关系
has-A,uses-A 和 is-A
has-A :包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。
uses-A : 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。
is-A : 机制称为“继承”。关系具有传递性,不具有对称性。
二、继承的基本语法
#include<iostream>
using namespace std;
class Parent
{
public:
void print()
{
a = 0;
b = 0;
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
}
int a;
int b;
protected:
private:
//int a;如果改成这样报错
};
//class Child : private Parent
//class Child : protected Parent
class Child : public Parent
{
public:
int c;
protected:
private:
};
int main()
{
Child c1;
c1.c = 1;
c1.a = 2;
c1.b = 3;
c1.print();
system("pause");
return 0;
}
三、单个类的访问控制---共有继承
#include<iostream>
using namespace std;
//public 关键字修饰的成员变量、方法 在类的内部外部够可以使用
//protected 修饰的成员变量、方法,在类的内部使用,在继承的子类中使用
//private 修饰的成员变量、方法,只能在类的内部使用
class Parent
{
public:
int a;
protected:
int b;
private:
int c;
public:
void printT()
{
cout<<"printT"<<endl;
}
};
class Child : public Parent
{
public:
void useVar()
{
a = 0;//ok 变量a 在基类中属性是共有的,在派生类继承后也是共有的public
b = 0;//变量b 在基类中属性是保护的,在派生类继承后也是保护的,言外之意就是在类的内部可以使用
//c = 0;// c私有的 派生类不能访问
}
protected:
private:
};
int main()
{
Parent t1,t2;
t1.a = 10;//OK public 之后还是public
/*
t1.b = 20;//Error public继承之后还是private 继承还是private,只能在类的内部使用,不能在类的外部使用
t2.c = 30;//私有的更不能用
*/
system("pause");
return 0;
}
四、单个类的访问控制---私有继承
#include<iostream>
using namespace std;
//public 关键字修饰的成员变量、方法 在类的内部外部够可以使用
//protected 修饰的成员变量、方法,在类的内部使用,在继承的子类中使用
//private 修饰的成员变量、方法,只能在类的内部使用
class Parent
{
public:
int a;//不恰当的比喻: 共有的相当于 老爹的名字--“老王”
protected:
int b;//老爹的银行密码---即不对外(public)公开,也不对内(protect)公开
private:
int c;//相当于老爹的情人
public:
void printT()
{
cout<<"printT"<<endl;
}
};
/*
“三看”原则
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)
*/
/*
C++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
*/
class Child2 : private Parent
{
public:
void useVar()
{
//子类继承老爹的名字 ---小王---可以使用“王”这个姓氏
a = 0;//OK 1:写在了子类的内部;2:子类从父类public继承;3:仍然为public
//假如小王变成了老王,老王变成了太上王,太上王有一天“挂了”,这个太上王肯定会把银行密码给小王,继承遗产 可以使用
b = 0;//OK 1:写在了子类的内部;2:子类从父类protect继承;3:仍然为protect 在子类的内部可以用,外部不可以用
//小王在名义上继承了这个“老爹的情人”--但是他如果想使用这个属性---不妥
// c = 0;//Error 1:写在了子类的内部;2:子类从父类private继承;3:仍然为private 不能访问
//父类当中私有的属性和方法,子类当中都不可以使用,但是它是继承的
}
protected:
private:
};
int main()
{
Child2 c2;
//c1.a = 10;Error
//c2.b = 20;Error
//c3.c = 10;Error
system("pause");
return 0;
}
五、单个类的访问控制--保护继承
#include<iostream>
using namespace std;
//public 关键字修饰的成员变量、方法 在类的内部外部够可以使用
//protected 修饰的成员变量、方法,在类的内部使用,在继承的子类中使用
//private 修饰的成员变量、方法,只能在类的内部使用
//protect 关键字 修饰的成员变量 和成员函数 是为了在家族中使用 是为了继承
//派生类类成员访问级别设置的原则
//思考:如何恰当的使用public,protected和private为成员声明访问级别?
//1、需要被外界访问的成员直接设置为public
//2、只能在当前类中访问的成员设置为private
//3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。
class Parent
{
public:
int a;
protected:
int b;
private:
int c;
public:
void printT()
{
cout<<"printT"<<endl;
}
};
class Child3 : protected Parent
{
public:
void useVar()
{
a = 0;//protected
b = 0;//protected
c = 0;//private---Error
}
protected:
private:
};
int main()
{
Parent c3;
c3.a = 10;
/*
c3.b = 20;//Error
c3.c = 30//Error
*/
system("pause");
return 0;
}