扩展类(C++)
继承是面向对象编程(OOP)的重要特征之一。它充当了扩展类(或派生类)概念的基础。C++支持这个概念。继承是指从一个类(基类)继承属性到另一个类(派生类)的能力。
C++允许用户从现有的类中构造新的类。新的类从它的父类派生出所有的属性和功能,同时也有自己的额外属性和功能。
- 基类。父类,其属性由另一个类继承。它也被称为**"超级类"。**
- 派生类。从父类中继承属性的类。它也被称为**"子类**"。
继承的优点
- 当一个子类形成时,它从超类继承所有的属性。因此,现有的代码被重新使用。
- 不会有任何内存空间的浪费,因为相同的属性被继承而不是重复。
- 这也导致了更快的进展和开发时间。
- 代码加强了维护和内存的利用。
可见性模式
**可见性模式定义了超类的属性是私下派生、公开派生还是保护派生。**可见性模式在控制访问指定器方面起着重要作用。它们确保属性被准确地继承到派生类中。基类的属性是以如下方式继承的。

上图显示了属性是如何继承的,以及如果基类和派生类是私有的、公共的或保护的,它们将分别处于何种状态。
定义派生类
声明一个子类或派生类和声明一个超类一样简单。通过在类(子类)名称后使用冒号(:),我们可以表明它(子类)是从另一个类(超类)派生出来的。
语法。
class subclass_name:visibility_mode superclass_name { ...派生类的成员... }。
这是声明一个派生类的语法。这里。
- class是关键字。
- subclass_name是派生类的名称。
- **:**是表示子类是从超类派生出来的符号。
- visibility_mode定义了派生的种类。
- superclass_name是基类的名称。
和超类一样,子类也拥有自己的数据成员和成员函数(在语法中被称为...派生类的成员...)。另外,子类的声明应该**用分号(;)**来结束。
注意:如果没有提到可见性模式,那么它就被默认为私有。
派生类的例子。
考虑abc()和def()作为基类和派生类,分别有两个int和char类型的数据成员。基类的两个成员函数将是demo1()和demo2(),派生类的两个成员函数将是demo3()和demo4()。
-
私有派生类
class abc
{
private:
int x;
char y[10];
public:
void demo1();
void demo1();
};
class def : private abc
{
private:
int p;
char q[10];
public:
void demo3();
void demo4();
};
-
公共派生类
class abc
{
private:
int x;
char y[10];
public:
void demo1();
void demo1();
};
class def : public abc
{
private:
int p;
char q[10];
public:
void demo3();
void demo4();
};
-
受保护的派生类
class abc
{
private:
int x;
char y[10];
public:
void demo1();
void demo1();
};
class def : protected abc
{
private:
int p;
char q[10];
public:
void demo3();
void demo4();
};
区分派生类
在上述所有的例子中,数据成员对基类是私有的。所以它们不会被继承到派生类中。**注意:**子类的可见性模式与数据成员的继承无关(只有当它们在基类中是私有的)。
私有继承
基类的数据成员可以被继承,因为它们是公共的。公有成员对子类来说是私有的。受保护的成员在继承后仍受保护。这意味着基类的一切都成为派生类的专属。
公有继承
这是最常用的继承模式。公有成员对子类再次成为公有。如果另一个类继承了前一个类的数据成员,这是有帮助的。这适用于所有的数据成员。但为了避免这种情况,一些成员可以被保护起来。通过这样做,受保护的成员在继承后仍然受到保护。
受保护的继承
数据成员成为派生类的受保护成员。这与基类中的数据成员是公共的还是受保护的无关。在这种类型的继承中,数据成员只能被同一类的对象访问。
友好函数
现在,我们已经知道,基类的私有和受保护的数据成员不能从外部(基类)访问。这意味着在基类外声明的成员函数被禁止作用于基类内声明的数据成员。要做到这一点,基类应该被公开访问。
C++有一个选项,在这个选项中,私有和受保护的数据成员可以在类外被访问,而不需要使基类公开。这就是*"友情函数 "*出现的地方。通过使该函数成为一个友方函数,可以在两个类之间共享共同的函数。
友好函数是一个非成员函数,是基类的朋友。它在类内通过在类名前使用关键字friend来声明。它被定义在类外*,而不*使用关键字。现在,它可以从类外访问私有和受保护的成员。
注意:友方函数不是一个成员函数,而是一个正常的外部函数,可以访问私有和受保护的成员。
演示友方函数的C++程序
考虑计算一个圆的面积的程序。这个类将以area() 的名字定义。让**input()**成为成员函数,将值转移到另一个变量。**calculate()**将是返回类型为double的友方函数。
#include<iostream>
#include<conio.h>
using namespace std;
class area
{
private:
int a;
public:
void input(int x);
friend double calculate(area demo);
};
void area :: input(int x)
{
a=x;
}
double calculate(area demo)
{
return (3.14*demo.a*demo.a);
}
int main()
{
area example;
example.input(5);
cout<<"The area of the circle is: "<<calculate(example)<<"sq.units."<<"\n";
return 0;
getch();
}
**注意:**朋友函数不能直接访问数据成员。所以它必须使用一个对象。使用对象访问数据成员的语法。
name.membername
在代码中,demo是名字,变量a是成员名。
上述程序的输出是。
The area of the circle is: 78.5sq.units.