C++继承

在C++中,继承是一个对象自动获得其父对象的所有属性和行为的过程。通过继承,您可以重用、扩展或修改在其他类中定义的属性和行为。

在C++中,继承了另一个类的成员的类被称为派生类,被继承成员的类被称为基类。派生类是基类的特殊化类。

C++继承的优点

代码重用性:现在您可以重用父类的成员。因此,不需要再次定义成员。因此,类中所需的代码更少。

继承的类型

C++支持五种类型的继承:

  • 单继承
  • 多重继承
  • 分层继承
  • 多级继承
  • 混合继承

1.png

派生类

派生类定义为从基类派生的类。

派生类的语法:

class 派生类名 : 访问修饰符 基类名 
{ 
// 派生类的主体。
} 

其中,

派生类名:派生类的名称。

访问修饰符:访问修饰符指定基类的特征是公开继承还是私有继承。它可以是public或private。

基类名:基类的名称。

  • 当基类被私有继承时,基类的公共成员成为派生类的私有成员。因此,派生类的对象不能访问基类的公共成员,只能通过派生类的成员函数来访问。
  • 当基类被公开继承时,基类的公共成员也成为派生类的公共成员。因此,派生类的对象以及基类的成员函数都可以访问基类的公共成员。

注意:

  • 在C++中,可见性的默认模式是私有。
  • 基类的私有成员永远不会被继承。

C++单继承

单继承被定义为派生类只从一个基类继承的继承。

2.png

其中'A'是基类,'B'是派生类。

C++单级继承示例:

继承字段 当一个类继承另一个类时,它被称为单级继承。让我们看一个只继承字段的单级继承的示例。

#include <iostream>
using namespace std;
class Account {
public:
float salary = 60000;
};
class Programmer: public Account {
public:
float bonus = 5000;
};
int main(void) {
Programmer p1;
cout<<"Salary: "<<p1.salary<<endl;
cout<<"Bonus: "<<p1.bonus<<endl;
return 0;
}

输出:

Salary: 60000 
Bonus: 5000 

在上面的示例中,Employee是基类,Programmer是派生类。

C++单级继承示例:继承方法

让我们看另一个C++中的继承示例,该示例仅继承方法。

#include <iostream>
using namespace std;
class Animal {
public:
void eat() {
cout<<"Eating..."<<endl;
}
};
class Dog: public Animal
{
public:
void bark(){
cout<<"Barking...";
}
};
int main(void) {
Dog d1;
d1.eat();
d1.bark();
return 0;
}

输出:

Eating... 
Barking... 

让我们来看一个简单的例子。

cppCopy code
#include <iostream>  
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 : "<<result<< std::endl;  
    }  
};  
int main()  
{  
   B b;  
   b.display();  
  
    return 0;  
}

输出:

cssCopy code
Multiplication of a and b is : 20

在上面的例子中,类A被私有继承。因此,类B的对象无法访问类A的mul()函数。只有类B的成员函数才能访问它。

如何使私有成员可继承

私有成员是不可继承的。如果我们将其可见性更改为public,这就取消了数据隐藏的优势。

C++引入了第三种可见性修饰符,即protected。声明为protected的成员将可以在类内的所有成员函数以及直接派生自它的类中访问。

可见性修饰符可以分为三类:

3.png

  • Public:当成员声明为public时,它可被程序中的所有函数访问。
  • Private:当成员声明为private时,它只能在类内部访问。
  • Protected:当成员声明为protected时,它既可以在自身类内部访问,也可以在直接派生自它的类中访问。

继承成员的可见性

基类可见性派生类可见性
PublicPrivateProtected
Private不可继承不可继承不可继承
ProtectedProtectedPrivateProtected
PublicPublicPrivateProtected

C++多层继承

多层继承是从一个派生类派生出另一个派生类的过程。

4.png

C++多层继承示例

当一个类继承另一个类,而后者又被另一个类继承时,在C++中称为多层继承。继承是传递的,因此最后一个派生类将继承所有基类的成员。

让我们看看C++中多层继承的示例。

#include <iostream>  
using namespace std;  
class Animal {  
   public:  
 void eat() {   
    cout<<"Eating..."<<endl;   
 }    
   };  
   class Dog: public Animal   
   {    
       public:  
     void bark(){  
    cout<<"Barking..."<<endl;   
     }    
   };   
   class BabyDog: public Dog   
   {    
       public:  
     void weep() {  
    cout<<"Weeping...";   
     }    
   };   
int main(void) {  
    BabyDog d1;  
    d1.eat();  
    d1.bark();  
     d1.weep();  
     return 0;  
}

输出:

Eating...
Barking...
Weeping...

C++多重继承

多重继承是从两个或更多类派生出一个新类的过程。

5.png

派生类的语法:

class D : 可见性 B-1, 可见性 B-2, ?
{
// 类的内容;
}

让我们看一个简单的多重继承的例子。

#include <iostream>  
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 << "a的值为:" << a << std::endl;  
        std::cout << "b的值为:" << b << std::endl;  
        cout << "a和b的相加结果为:" << a + b;  
    }  
};  
int main()  
{  
   C c;  
   c.get_a(10);  
   c.get_b(20);  
   c.display();  
  
    return 0;  
}

输出:

a的值为:10
b的值为:20
a和b的相加结果为:30

在上面的例子中,类'C'以公有方式继承了两个基类'A'和'B'。

继承中的歧义解决

当在多重继承中两个或多个基类中出现同名函数时,会产生歧义。

通过以下示例来理解这一点:

#include <iostream>  
using namespace std;  
class A  
{  
    public:  
    void display()  
    {  
        std::cout << "类A" << std::endl;  
    }  
};  
class B  
{  
    public:  
    void display()  
    {  
        std::cout << "类B" << std::endl;  
    }  
};  
class C : public A, public B  
{  
    void view()  
    {  
        display();  
    }  
};  
int main()  
{  
    C c;  
    c.display();  
    return 0;  
}

输出:

错误:对'display'的引用不明确
        display();

可以通过使用类作用域运算符来解决上述问题。在上面的示例中,派生类代码可以重新编写为:

class C : public A, public B  
{  
    void view()  
    {  
        A::display();         // 调用类A的display()函数。  
        B::display();         // 调用类B的display()函数。  
    }  
};

在单继承中也可能出现歧义。

考虑以下情况:

class A  
{  
   public:  
void display()  
{  
   cout << "类A" << endl;  
}   
} ;  
class B  
{   
  public:  
 void display()  
{  
 cout << "类B" << endl;  
}  
} ;

在上述情况下,派生类的函数覆盖了基类的方法。因此,对display()函数的调用将简单地调用派生类中定义的函数。如果我们想调用基类函数,我们可以使用类作用域运算符。

int main()  
{  
    B b;  
   b.display();               // 调用B类的display()函数。  
   b.B :: display();       // 调用在B类中定义的display()函数。  
}  

C++混合继承

混合继承是多种类型继承的组合。

6.png

让我们看一个简单的例子:

#include <iostream>  
using namespace std;  
class A  
{  
    protected:  
    int a;  
    public:  
    void get_a()  
    {  
       cout << "请输入'a'的值:" << endl;  
       cin>>a;  
    }  
};  
  
class B : public A   
{  
    protected:  
    int b;  
    public:  
    void get_b()  
    {  
        cout << "请输入'b'的值:" << endl;  
       cin>>b;  
    }  
};  
class C   
{  
    protected:  
    int c;  
    public:  
    void get_c()  
    {  
        cout << "请输入'c'的值:" << endl;  
        cin>>c;  
    }  
};  
  
class D : public B, public C  
{  
    protected:  
    int d;  
    public:  
    void mul()  
    {  
         get_a();  
         get_b();  
         get_c();  
         cout << "a、b、c的乘积为:" <<a*b*c<< endl;  
    }  
};  
int main()  
{  
    D d;  
    d.mul();  
    return 0;  
}

输出:

请输入'a'的值:
10              
请输入'b'的值:
20      
请输入'c'的值:
30  
a、b、c的乘积为:6000

C++分层继承

分层继承是从一个基类派生出两个或更多个类的过程。

7.png

分层继承的语法:

class A  
{  
    // 类A的内容。  
}    
class B : public A   
{  
    // 类B的内容。  
}  
class C : public A  
{  
    // 类C的内容。  
}   
class D : public A  
{  
    // 类D的内容。  
}  

让我们看一个简单的例子:

#include <iostream>  
using namespace std;  
class Shape                 // 声明基类。  
{  
    public:  
    int a;  
    int b;  
    void get_data(int n,int m)  
    {  
        a= n;  
        b = m;  
    }  
};  
class Rectangle : public Shape  // 继承Shape类  
{  
    public:  
    int rect_area()  
    {  
        int result = a*b;  
        return result;  
    }  
};  
class Triangle : public Shape    // 继承Shape类  
{  
    public:  
    int triangle_area()  
    {  
        float result = 0.5*a*b;  
        return result;  
    }  
};  
int main()  
{  
    Rectangle r;  
    Triangle t;  
    int length,breadth,base,height;  
    cout << "请输入矩形的长度和宽度:" << endl;  
    cin>>length>>breadth;  
    r.get_data(length,breadth);  
    int m = r.rect_area();  
    cout << "矩形的面积为:" <<m<< endl;  
    cout << "请输入三角形的底和高:" << endl;  
    cin>>base>>height;  
    t.get_data(base,height);  
    float n = t.triangle_area();  
    cout <<"三角形的面积为:"  << n<<endl;  
    return 0;  
}

输出:

请输入矩形的长度和宽度:
23  
20  
矩形的面积为:460          
请输入三角形的底和高:
2   
5
三角形的面积为:5

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想