C++继承的定义
C++中的继承是指一个类可以从另一个类中继承属性和行为。被继承的类称为父类或基类,继承的类称为派生类或子类。
在C++中,使用冒号符号来进行继承,语法如下:
class 子类名 : 访问修饰符 基类
{
//子类的其他内容
};
其中,访问修饰符
可以是public
、protected
或private
,用来决定派生类继承来的基类成员的访问权限。
public
表示公有继承,在派生类中继承来的成员可以被外部访问;protected
表示保护继承,在派生类中继承来的成员不能被外部访问,但可以被派生类和其他基类的成员函数访问;private
表示私有继承,在派生类中继承来的成员只能被派生类的成员函数访问。
继承的注意事项
- 构造函数和析构函数的继承
派生类不会继承基类的构造函数和析构函数,但是在创建和销毁派生类对象时,会先调用基类的构造函数和析构函数,再调用派生类的构造函数和析构函数。
- 基类成员的访问权限
在派生类中,继承来的基类成员的访问权限受到访问修饰符
的控制。
- 如果是公有继承,那么继承来的基类成员,无论是公有的、保护的还是私有的,都可以在派生类中被访问;
- 如果是保护继承,那么继承来的公有成员会变成保护成员,在派生类中只能被该类及其子类访问,而私有成员不会被继承;
-
如果是私有继承,那么继承来的基类成员都会变成派生类的私有成员,在派生类外部无法访问,只能在该类内部访问。
-
派生类与基类成员同名
如果派生类中的成员与基类中的成员同名,那么在派生类中访问该成员时,会默认访问派生类中的成员,如果想要访问基类中的成员,则可以使用作用域解析运算符::
。
class Base
{
public:
int num = 10;
};
class Derived : public Base
{
public:
int num = 20;
void show()
{
cout << "Derived num: " << num << endl; //输出20
cout << "Base num: " << Base::num << endl; //输出10
}
};
示例说明
示例一
下面这个示例展示了一个简单的好处说明。
#include <iostream>
using namespace std;
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// 在派生类中继承基类成员
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
在这个示例中,基类Shape
有两个函数setWidth()
和setHeight()
以及两个保护成员width
和height
。派生类Rectangle
从Shape
类中继承了宽度和高度,并且实现了一个新方法getArea()
,用来计算矩形的面积。在main()
方法中,我们创建了一个Rectangle
对象并设置它的宽度和高度,最后输出对象的面积。这个示例演示了一个派生类从基类中继承成员的过程,以及如何在派生类中访问这些成员。
示例二
下面这个示例展示了如何使用作用域解析运算符访问基类中的成员。
#include <iostream>
using namespace std;
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// 在派生类中继承基类成员
class Rectangle: public Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
在这个示例中,派生类Rectangle
中的方法setWidth()
和setHeight()
与基类Shape
中的方法同名。当我们使用Rect.setWidth()
时,会默认访问派生类中的setWidth()
方法,因此宽度的值不会被传递给基类。为了解决这个问题,我们可以使用作用域解析运算符::
访问基类中的setWidth()
和setHeight()
方法,从而正确地设置宽度和高度。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++继承的定义与注意事项 - Python技术站