1、前言
前文博客介绍了修饰符public、private、protected在类中成员变量和函数访问权限限制的总结,主要如下:
-
public(公有):
- 公有成员在类的内部和外部都可以被访问。
-
private(私有):
- 私有成员只能在类的内部被访问,不能在类的外部直接访问。
-
protected(保护):
- 保护成员在类的内部可以被访问,在类的外部不能被直接访问。
具体可参见博客C++之类(class)的三种访问修饰符(public、private、protected)----成员变量与函数权限-CSDN博客
这篇博客介绍修饰符public、private、protected在类继承上权限限制,总结如下:
-
公有继承(public):
- 公有继承的规则是“is-a”关系,即子类是基类的一种。
- 基类的公有成员在子类中保持公有属性。
- 基类的保护成员在子类中保持保护属性。
- 基类的私有成员不可被继承,因此在子类中不可见。
-
派生类中的成员函数可以直接访问基类中的
public
和protected
成员,但不能直接访问基类的private
成员。 -
通过派生类的对象访问从基类继承的成员,只能访问
public
成员。
-
保护继承(protected):
- 保护继承通常用于实现“is-implemented-in terms of”关系。
- 基类的公有成员和保护成员在子类中都变为保护属性。
- 基类的私有成员不可被继承,因此在子类中不可见。
- 生类中的成员函数可以直接访问基类中的
public
和protected
成员,但不能直接访问基类的private
成员。 - 通过派生类的对象不能直接访问从基类继承的任何成员。
-
私有继承(private):
- 私有继承用于实现“uses-a”关系,即子类使用基类来实现某些功能,但不是基类的一种。
- 基类的公有成员和保护成员在子类中都变为私有属性。
- 基类的私有成员不可被继承,因此在子类中不可见。
- 派生类中的成员函数可以直接访问基类中的
public
和protected
成员,但不能直接访问基类的private
成员。 - 通过派生类的对象不能直接访问从基类继承的任何成员
2、类中属性访问权限示例介绍
2.1、public类继承
基类Shape被Rectangle以public形式进行继承,
测试源代码如下:
#include<iostream>
using namespace std;
//基类
class Shape
{
public:
double width;//宽度
protected:
double length;//长度
public:
void setWidth(double width);
void setLength(double length);
double getLength();
};
void Shape::setWidth(double width)
{
this->width = width;
}
void Shape::setLength(double length)
{
this->length = length;
}
double Shape::getLength()
{
return length;
}
//派生类
class Rectangle :public Shape
{
public:
double Area();
};
double Rectangle::Area()
{
return width*length;//直接访问基类public属性
}
int main()
{
Rectangle RecObj;
RecObj.setLength(4);
RecObj.setWidth(2);
cout << "length of rectangle is " << RecObj.length << endl;
cout << "length of rectangle is " << RecObj.getLength() << endl;
cout << "width of rectangle is " << RecObj.width << endl;
cout << "area of rectangle is " << RecObj.Area() << endl;
}
2.2 protected类继承
基类Shape被Rectangle以protected形式进行继承
测试代码:
#include<iostream>
using namespace std;
//基类
class Shape
{
public:
double width;//宽度
protected:
double length;//长度
public:
void setWidth(double width);
void setLength(double length);
double getLength();
};
void Shape::setWidth(double width)
{
this->width = width;
}
void Shape::setLength(double length)
{
this->length = length;
}
double Shape::getLength()
{
return length;
}
//派生类
class Rectangle :protected Shape
{
public:
double Area();
};
double Rectangle::Area()
{
return width*length;//直接访问基类public属性
}
int main()
{
Rectangle RecObj;
RecObj.setLength(4);
RecObj.setWidth(2);
cout << "length of rectangle is " << RecObj.length << endl;
cout << "length of rectangle is " << RecObj.getLength() << endl;
cout << "width of rectangle is " << RecObj.width << endl;
cout << "area of rectangle is " << RecObj.Area() << endl;
}
2.3、private类继承
基类Shape被Rectangle以protected形式进行继承
测试代码:
#include<iostream>
using namespace std;
//基类
class Shape
{
public:
double width;//宽度
protected:
double length;//长度
public:
void setWidth(double width);
void setLength(double length);
double getLength();
};
void Shape::setWidth(double width)
{
this->width = width;
}
void Shape::setLength(double length)
{
this->length = length;
}
double Shape::getLength()
{
return length;
}
//派生类
class Rectangle :private Shape
{
public:
double Area();
};
double Rectangle::Area()
{
return width*length;//直接访问基类public属性
}
int main()
{
Rectangle RecObj;
RecObj.setLength(4);
RecObj.setWidth(2);
cout << "length of rectangle is " << RecObj.length << endl;
cout << "length of rectangle is " << RecObj.getLength() << endl;
cout << "width of rectangle is " << RecObj.width << endl;
cout << "area of rectangle is " << RecObj.Area() << endl;
}
3、总结
继承是面向对象编程中实现代码重用和扩展的重要机制。通过继承,子类可以扩展基类的功能,或者在基类的基础上添加新的功能。使用修饰符public、private、protected可以对已有类中功能进行保留和舍去。