1.什么是继承?
继承是一种面向对象编程的重要特性,它允许一个类(称为派生类或子类)从另一个类(称为基类或父类)继承属性和行为。通过继承,子类可以重用基类的成员,并且可以添加自己的新成员或修改继承的成员。
2.继承的作用是什么?
继承和派生,它建立一种is-a(subsumption,包含架构指的是类的父子继承关系)关系,即派生类对象也是一个基类对象,对基类对象执行的操作,也可以对派生类对象执行。
当从现有类中派生出新类时,派生类可以有以下几种变化:
(1)增加新的数据成员;
(2)增加新的成员函数;
(3)重新定义已有成员函数
继承还可以建立类之间的层次关系,形成逻辑和现实世界对象之间的关系模型。
3.继承的方式有哪些?
C++中有三种继承方式:
(1)public:公有继承,父类的成员是什么就是什么
(2)protected:保护继承,继承下来一般就变成了保护的成员
(3)private:私有继承,继承下来就是私有成员
4.各种继承方式子类对父类的访问权限是什么?
(1)公有继承
使用最多的继承方式,父类中的私有不能在子类中访问,公有还是公有,保护还是保护
class A//父类
{
public:
void show1()
{
cout << "A::show1(),公有方法" << endl;
}
protected:
void show2()
{
cout << "A::show2(),保护方法" << endl;
}
private:
void show3()
{
cout << "A::show3(),私有方法" << endl;
}
public:
int m_a = 0;
protected:
int m_b = 1;
private:
int m_c = 2;
};
class B :public A//子类
{
public:
void show()
{
show1();//可以,继承下来是public,可以在类外访问
show2();//可以,继承下来是protected,不可以在类外访问
//show3();//私有属性,不能访问
cout << m_a << endl;//可以,继承下来是public,可以在类外访问
cout << m_b << endl;//可以,继承下来是protected,不可以在类外访问
//cout << m_c << endl;//私有属性,不能访问
}
};
int main()
{
B b1;
b1.show1();//public可以在类外访问
//b1.show2();//protected不能在类外访问
b1.m_a = 100;//public可以在类外访问
//b1.m_b = 200;//protected不能在类外访问
b1.show();//public可以在类外访问
return 0;
}
运行结果如上图所示。(后面两个一样)
A作为父类,其中的公有,保护属性的方法在子类B中都可以被访问,但是A中的私有属性的方法在子类B中不能被访问。
B中的show1是公有的,在类外也可以被访问,B中的show2是保护类,在类外不能被访问
A中公有,保护属性的数据成员在子类B中都能被访问,但私有属性的数据成员m_c在子类中不能被访问
在子类B中,m_a是公有的,那么在类外也能被访问,但m_b是保护属性,在类外就不能被访问
(2)保护继承
父类中的私有不能在子类中访问,公有变保护,保护还是保护
class A//父类
{
public:
void show1()
{
cout << "A::show1(),公有方法" << endl;
}
protected:
void show2()
{
cout << "A::show2(),保护方法" << endl;
}
private:
void show3()
{
cout << "A::show3(),私有方法" << endl;
}
public:
int m_a = 0;
protected:
int m_b = 1;
private:
int m_c = 2;
};
class B :protected A//子类
{
public:
void show()
{
show1();//可以,继承下来是protected,不可以在类外访问
show2();//可以,继承下来是protected,不可以在类外访问
//show3();//私有属性,不能访问
cout << m_a << endl;//可以,继承下来是protected,不可以在类外访问
cout << m_b << endl;//可以,继承下来是protected,不可以在类外访问
//cout << m_c << endl;//私有属性,不能访问
}
};
int main()
{
B b1;
//b1.show1();//protected不能在类外访问
//b1.show2();//protected不能在类外访问
//b1.m_a = 100;//protected不能在类外访问
//b1.m_b = 200;//protected不能在类外访问
b1.show();//public可以在类外访问
return 0;
}
(3)私有继承
父类的私有在子类中不能访问,公有变私有,保护变私有
class A//父类
{
public:
void show1()
{
cout << "A::show1(),公有方法" << endl;
}
protected:
void show2()
{
cout << "A::show2(),保护方法" << endl;
}
private:
void show3()
{
cout << "A::show3(),私有方法" << endl;
}
public:
int m_a = 0;
protected:
int m_b = 1;
private:
int m_c = 2;
};
class B :private A//子类
{
public:
void show()
{
show1();//可以,继承下来是private,不可以在类外访问
show2();//可以,继承下来是private,不可以在类外访问
//show3();//私有属性,不能访问
cout << m_a << endl;//可以,继承下来是private,不可以在类外访问
cout << m_b << endl;//可以,继承下来是private,不可以在类外访问
//cout << m_c << endl;//私有属性,不能访问
}
};
int main()
{
B b1;
//b1.show1();//private不能在类外访问
//b1.show2();//private不能在类外访问
//b1.m_a = 100;//private不能在类外访问
//b1.m_b = 200;//private不能在类外访问
b1.show();//public可以在类外访问
return 0;
}
综上所述:1.父类中private成员不能被子类访问
2.继承方式和访问属性不同时,按照权限小的合并。(比如,public和protected合并成 protected)