继承是C++代码复用的常用手段,发生在类之间,通过继承,子类可以拥有部分(甚至全部)父类的属性和行为。
C++类中经常会用到3个关键字:public
,private
,protected
,用以限定访问级别以及继承方式。其中,用作访问级别限定时修饰的是类内成员,而用作继承方式时修饰的是类名。
访问级别
- 声明为
public
的成员,类外部、子类都可以访问 - 声明为
private
的成员,类外部、子类都不可以访问 - 声明为
protected
的成员,类外部不能访问、子类可以访问
通过对比可以发现private限制最严格,public限制最宽松,而protected介于二者之间。事实上protected是为继承而生的,能够有效防止继承后数据被外界访问,同时继承后的数据可以向类成员开放。
以下程序中,父类分别定义了三种访问级别的成员:m_public
,m_private
,m_protected
,虽然子类中未定义成员变量,但子类继承了父类,因此子类中可以访问父类成员
#include<iostream>
using namespace std;
class Base
{
public://外部、子类都可以访问
int m_public;
private://外部、子类都不能访问
int m_private;
protected://外部不能访问、子类可以访问
int m_protected;
public:
Base() :m_public(100),m_private(200),m_protected(300)
{
cout << "基类构造" << endl;
}
void print()
{
cout<<"m_public: "<<m_public<<endl;
cout<<"m_private: "<<m_private<<endl;
cout<<"m_protected: "<<m_protected<<endl;
}
};
class Derived : public Base
{
public:
void print_base()
{
print();//父类的公有成员函数
cout<<"----------------------"<<endl;
cout<<"m_public: "<<m_public<<endl;
//cout<<"m_private: "<<m_private<<endl; 子类不能访问父类private成员
cout<<"m_protected: "<<m_protected<<endl;
}
};
int main()
{
Derived d;//子类对象
d.print_base();//子类对象的公有成员函数
d.m_public=400;//类外可以访问父类public成员
cout<<d.m_public<<endl;
return 0;
}
运行结果
基类构造
m_public: 100
m_private: 200
m_protected: 300
----------------------
m_public: 100
m_protected: 300
400
注:关于父类protected
成员,在子类中可以正常访问,但不能通过子类对象访问,这样相当于在类外访问,如:
d.m_protected=1;//不能在类外访问protected修饰的父类成员,是被不允许的,报错!
继承方式
同样是上例,子类Derived
的定义中有class Derived : public Base
,意为public
继承自Base
类
class Derived : public Base
{}
C++也支持private继承和protected继承,但一般只用public
继承,原因是:
protected和private继承带来的复杂性远大于实用性
参考
狄泰软件学院 - C++深度解析教程 - 第44课、45课