📅  最后修改于: 2020-10-16 07:02:23             🧑  作者: Mango
在C++中,继承是一个过程,其中一个对象自动获取其父对象的所有属性和行为。这样,您可以重用,扩展或修改在其他类中定义的属性和行为。
在C++中,继承另一个类的成员的类称为派生类,其成员被继承的类称为基类。派生类是基类的专用类。
代码可重用性:现在,您可以重用父类的成员。因此,无需再次定义成员。因此,该类中所需的代码更少。
C++支持五种继承:
派生类定义为从基类派生的类。
派生类的语法:
class derived_class_name :: visibility-mode base_class_name
{
// body of the derived class.
}
哪里,
派生的类名:这是派生类的名称。
可见性模式:可见性模式指定基类的功能是公共继承的还是私有继承的。它可以是公共的或私有的。
base_class_name:它是基类的名称。
单一继承定义为从唯一的一个基类继承派生类的继承。
其中“ A”是基类,而“ B”是派生类。
当一个类继承另一类时,称为单级继承。让我们看一下仅继承字段的单级继承示例。
#include
using namespace std;
class Account {
public:
float salary = 60000;
};
class Programmer: public Account {
public:
float bonus = 5000;
};
int main(void) {
Programmer p1;
cout<<"Salary: "<
输出:
Salary: 60000
Bonus: 5000
在上面的示例中,Employee是基类,而Programmer是派生类。
让我们看看C++中继承的另一个示例,该示例仅继承方法。
#include
using namespace std;
class Animal {
public:
void eat() {
cout<<"Eating..."<
输出:
Eating...
Barking...
让我们看一个简单的例子。
#include
using namespace std;
class A
{
int a = 4;
int b = 5;
public:
int mul()
{
int c = a*b;
return c;
}
};
class B : private A
{
public:
void display()
{
int result = mul();
std::cout <<"Multiplication of a and b is : "<
输出:
Multiplication of a and b is : 20
在上面的示例中,类A是私有继承的。因此,类“ A”的mul()函数不能被类B的对象访问。只能由类B的成员函数访问。
私有成员不可继承。如果我们通过公开公开性来修改可见性模式,但这将消除数据隐藏的优势。
C++引入了第三个可见性修饰符,即受保护的。该声明为受保护的成员将是类以及类中所有的成员函数立即从它派生的访问。
可见性模式可以分为三类:
Base class visibility | Derived class visibility | ||
---|---|---|---|
Public | Private | Protected | |
Private | Not Inherited | Not Inherited | Not Inherited |
Protected | Protected | Private | Protected |
Public | Public | Private | Protected |
多级继承是从另一个派生类派生一个类的过程。
当一个类继承另一个类又被另一个类继承时,在C++中称为多级继承。继承是可传递的,因此最后一个派生类将获取其所有基类的所有成员。
让我们看一下C++中多级继承的示例。
#include
using namespace std;
class Animal {
public:
void eat() {
cout<<"Eating..."<
输出:
Eating...
Barking...
Weeping...
多重继承是派生一个新类的过程,该类继承了两个或更多类的属性。
派生类的语法:
class D : visibility B-1, visibility B-2, ?
{
// Body of the class;
}
让我们看一个简单的多重继承的例子。
#include
using namespace std;
class A
{
protected:
int a;
public:
void get_a(int n)
{
a = n;
}
};
class B
{
protected:
int b;
public:
void get_b(int n)
{
b = n;
}
};
class C : public A,public B
{
public:
void display()
{
std::cout << "The value of a is : " <
输出:
The value of a is : 10
The value of b is : 20
Addition of a and b is : 30
在上面的示例中,类“ C”在公共模式下继承了两个基类“ A”和“ B”。
当同一个名称的函数出现在多个基类中时,在使用多重继承时可能会产生歧义。
让我们通过一个例子来理解这一点:
#include
using namespace std;
class A
{
public:
void display()
{
std::cout << "Class A" << std::endl;
}
};
class B
{
public:
void display()
{
std::cout << "Class B" << std::endl;
}
};
class C : public A, public B
{
void view()
{
display();
}
};
int main()
{
C c;
c.display();
return 0;
}
输出:
error: reference to 'display' is ambiguous
display();
class C : public A, public B
{
void view()
{
A :: display(); // Calling the display() function of class A.
B :: display(); // Calling the display() function of class B.
}
};
单一继承中也可能出现歧义。
请考虑以下情况:
class A
{
public:
void display()
{
cout<
在上述情况下,派生类的函数将覆盖基类的方法。因此,调用display()函数将只调用派生类中定义的函数。如果要调用基类函数,则可以使用类解析运算符。
int main()
{
B b;
b.display(); // Calling the display() function of B class.
b.B :: display(); // Calling the display() function defined in B class.
}
混合继承是一种以上类型的继承的组合。
让我们看一个简单的例子:
#include
using namespace std;
class A
{
protected:
int a;
public:
void get_a()
{
std::cout << "Enter the value of 'a' : " << std::endl;
cin>>a;
}
};
class B : public A
{
protected:
int b;
public:
void get_b()
{
std::cout << "Enter the value of 'b' : " << std::endl;
cin>>b;
}
};
class C
{
protected:
int c;
public:
void get_c()
{
std::cout << "Enter the value of c is : " << std::endl;
cin>>c;
}
};
class D : public B, public C
{
protected:
int d;
public:
void mul()
{
get_a();
get_b();
get_c();
std::cout << "Multiplication of a,b,c is : " <
输出:
Enter the value of 'a' :
10
Enter the value of 'b' :
20
Enter the value of c is :
30
Multiplication of a,b,c is : 6000
层次继承定义为从基类派生多个类的过程。
层次继承的语法:
class A
{
// body of the class A.
}
class B : public A
{
// body of class B.
}
class C : public A
{
// body of class C.
}
class D : public A
{
// body of class D.
}
让我们看一个简单的例子:
#include
using namespace std;
class Shape // Declaration of base class.
{
public:
int a;
int b;
void get_data(int n,int m)
{
a= n;
b = m;
}
};
class Rectangle : public Shape // inheriting Shape class
{
public:
int rect_area()
{
int result = a*b;
return result;
}
};
class Triangle : public Shape // inheriting Shape class
{
public:
int triangle_area()
{
float result = 0.5*a*b;
return result;
}
};
int main()
{
Rectangle r;
Triangle t;
int length,breadth,base,height;
std::cout << "Enter the length and breadth of a rectangle: " << std::endl;
cin>>length>>breadth;
r.get_data(length,breadth);
int m = r.rect_area();
std::cout << "Area of the rectangle is : " <>base>>height;
t.get_data(base,height);
float n = t.triangle_area();
std::cout <<"Area of the triangle is : " << n<
输出:
Enter the length and breadth of a rectangle:
23
20
Area of the rectangle is : 460
Enter the base and height of the triangle:
2
5
Area of the triangle is : 5