1、继承
随便定义一个类
class people
{
private :
int i;
protected:
int j;
public:
int k;
public :
people()
{
i = 1;
j = 2;
k = 3;
}
public :
void display()
{
cout<<i<<endl;
}
} ;
公有继承
公有继承的类,父类中的成员和函数在子类中不改变权限,原来为public仍然为public,可以在类外部(对象)访问,protected也没有改变仍然只能在类内部,而private虽然还是为private类型,在使用时可以理解为无法继承,无法使用(但确实是继承了),因为父类中的被private修饰的成员无法在其他类中被访问(友元类除外)。
class student:public people
{
public :
student(){
}
void coutpro()
{
/*i = i + 20;cout<<i<<endl;编译器报错*/
j = j + 10;
cout<<j<<endl;
}
};
int main()
{
student stu;
cout<<stu.k<<endl;/*cout<<stu.j;编译器报错*/
stu.coutpro();
people p;
p.display();/*一个类的private成员只能通过本身的内部访问*/
return 0;
}
保护继承
private成员仍然不能被访问,其他类型成员在子类中全部为protected,只能通过内部访问,可以将整个类封装起来,这个子类的全部成员外部是无法访问的,只有在实例化时,类本身对其成员进行操作。保护了类中所有的成员,避免其他代码无意有意更改。
class student:protected people
{
public :
student(){
}
void coutpro()
{
k = k + 20;
j = j + 10;
cout<<j<<endl<<k<<endl;
}
};
int main()
{
student stu;
/*cout<<stu.k<<endl;编译器报错*/
stu.coutpro();
return 0;
}
私有继承
子类私有继承父类,父类的private仍然不可以被访问,父类中其他成员在子类中均为private只有子类可以进行内部访问。这点和保护继承相同,区别是:子类私有继承了父类之后,其所有成员全是private型,这个子类的子类无论以什么方式继承都无法访问任何一个变量。而保护继承的子类,其中的成员为protected,只要有类再次保护继承,就可以实现一串外部不可见、自己维护成员、连续继承的类。
多重继承
一个类可以继承多个类,继承方式也可以不相同。
调用父类的带参构造函数
一个类可以继承多个类。在实例化时,构造函数的调用顺序,依然是父类-->子类,当有多个父类时,按参数列表继承,也就是在继承运算符:之后先写的哪个类就先调用哪个类的构造函数。
默认情况优先调用父类的无参构造函数,无论父类里是否存在带参构造函数、子类构造函数是否有参数。
想要调用父类的带参构造函数需子类显示调用。
#include<iostream>
using namespace std;
class Binary
{
protected :
int B_value;
public :
Binary(int i){
if(i >= 1)
{
B_value = 1;
}
else
{
B_value - 0;
}
cout<<"Binary:"<<endl;
}
};
class Number
{
protected :
int N_value;
public :
Number(int i){
N_value = i;
cout<<"Number:"<<endl;
}
};
class one : protected Binary,public Number
{
public :
one(int i):Binary(i),Number(i)
{
}
public :
void display()
{
cout<<"B:"<<B_value<<endl<<"N:"<<N_value<<endl;
}
};
int main()
{
one o(10);
o.display();
return 0;
}
上述代码实例化一个one类,它既属于二进制数,也属于数字类,在实例化时显示调用父类带参函数。继承方式:保护继承二进制数,外部无法更改这个B_value量,而数字类的N_value可以被外部更改。
二义性
多重继承时父类不要出现同名成员,不然系统无法确定在调用时具体调用哪个类里面的成员。