背景

C++是一种面向对象的编程语言,支持继承和多态等面向对象的特性。继承是面向对象编程中的一个重要概念,它允许程序员创建一个新的类,并从一个或多个现有的类中继承属性和方法。本篇博客将介绍C++中的继承概念以及继承的几种方式。

继承的概念

继承是一种面向对象的概念,它允许程序员创建一个新的类,并从一个或多个现有的类中继承属性和方法。继承是通过定义一个新的类来实现的,新的类称为派生类,现有的类称为基类。派生类继承了基类的所有属性和方法,并可以添加新的属性和方法。

继承的优点在于可以通过重用现有的代码来提高程序的可维护性和可扩展性。如果两个或多个类共享某些属性和方法c++继承,可以将这些属性和方法定义在一个基类中,然后让这些类从基类中继承这些属性和方法,从而避免代码的重复编写。

c++ 继承 构造函数_c++继承_c 继承中的内存布局

继承的几种方式公有继承(Public Inheritance)

公有继承是最常用的继承方式。在公有继承中,派生类继承了基类的公有成员、保护成员和私有成员。在派生类中,公有成员仍然是公有的,保护成员仍然是保护的,但是私有成员仍然是私有的,不能从派生类中访问。

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class Derived : public Base {
public:
    void print() {
        cout << public_member << endl;    // 可以访问基类的公有成员
        cout << protected_member << endl; // 可以访问基类的保护成员
        //cout << private_member << endl; // 不可以访问基类的私有成员
    }
};

保护继承(Protected Inheritance)

保护继承与公有继承类似c++继承,但是基类的公有成员在派生类中变成了保护成员。这意味着派生类的成员函数可以访问基类的公有成员,但是不能从派生类外部访问。

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class Derived : protected Base {
public:
    void print() {
        cout << public_member << endl;    // 可以访问基类的公有成员
        cout << protected_member << endl; // 可以访问基类的保护成员
        //cout << private_member << endl; // 不可以访问基类的私有成员
}
};

int main() {
Derived d;
//cout << d.public_member << endl; // 不可以访问基类的公有成员
//cout << d.protected_member << endl; // 不可以访问基类的保护成员
//cout << d.private_member << endl; // 不可以访问基类的私有成员
d.print(); // 可以通过成员函数访问基类的公有和保护成员
return 0;
}

私有继承(Private Inheritance)

私有继承与保护继承类似,但是基类的公有和保护成员在派生类中都变成了私有成员。这意味着派生类的成员函数可以访问基类的公有和保护成员,但是不能从派生类外部访问。

class Base {
public:
    int public_member;
protected:
    int protected_member;
private:
    int private_member;
};

class Derived : private Base {
public:
    void print() {
        cout << public_member << endl;    // 可以访问基类的公有成员
        cout << protected_member << endl; // 可以访问基类的保护成员
        //cout << private_member << endl; // 不可以访问基类的私有成员
    }
};

int main() {
    Derived d;
    //cout << d.public_member << endl;    // 不可以访问基类的公有成员
    //cout << d.protected_member << endl; // 不可以访问基类的保护成员
    //cout << d.private_member << endl;   // 不可以访问基类的私有成员
    d.print(); // 可以通过成员函数访问基类的公有和保护成员
    return 0;
}

多重继承(Multiple Inheritance)

多重继承允许一个派生类从多个基类中继承属性和方法。在多重继承中,派生类继承了多个基类的所有公有成员、保护成员和私有成员。如果多个基类中有相同的成员,派生类只继承其中一个。

class Base1 {
public:
    void print1() {
        cout << "Base1" << endl;
    }
};

class Base2 {
public:
    void print2() {
        cout << "Base2" << endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    void print() {
        print1(); // 可以调用Base1的方法
        print2(); // 可以调用Base2的方法
    }
};

int main() {
    Derived d;
    d.print();
    return 0;
}

当多个基类中有相同的成员时,派生类只能继承其中一个成员,否则会引起二义性。在这种情况下,需要显式地指定要继承的成员,可以使用作用域解析运算符(::)来指定成员所属的类。例如,有两个基类A和B,它们都有一个名为x的成员变量,现在需要在派生类C中继承其中一个。可以通过以下方式来实现:

class A {
public:
    int x;
};

class B {
public:
    int x;
};

class C : public A, public B {
public:
    C() {
        // 继承A中的x
        A::x = 1;
        // 继承B中的x
        // B::x = 2;
    }
};

在上面的代码中,派生类C同时继承了基类A和B,它们都有一个名为x的成员变量。在构造函数中,使用作用域解析运算符来指定要继承的成员,从而避免二义性。

需要注意的是,如果基类A和B中的x成员变量类型不同,那么在派生类C中也需要定义一个新的成员变量来代表它们,否则会导致成员变量类型不匹配的编译错误。

❞总结

继承是面向对象编程中的一个重要概念,它允许程序员通过重用现有类的代码来定义新的类,并且可以实现代码的复用和扩展。C++中的继承包括公有继承、保护继承、私有继承和多重继承。公有继承是最常用的一种继承方式,派生类可以访问基类的公有和保护成员,但不能访问基类的私有成员。保护继承与公有继承类似,但是基类的公有成员在派生类中变成了保护成员。私有继承与保护继承类似,但是基类的公有和保护成员在派生类中都变成了私有成员。多重继承允许一个派生类从多个基类中继承属性和方法。

在使用继承时,需要注意一些细节。首先,如果派生类的构造函数没有显式调用基类的构造函数,编译器会自动调用默认构造函数。其次,析构函数的调用顺序与构造函数相反,先调用派生类的析构函数,然后再调用基类的析构函数。另外,在继承中,基类和派生类可能出现同名成员,为了避免二义性,可以使用作用域解析运算符(::)来指定成员所属的类。

继承是C++中的一个重要特性,它可以使代码更加灵活和易于维护。但是过度的继承会导致代码复杂度增加,降低程序的可读性和可维护性。因此,在使用继承时,需要合理设计类的层次结构,避免出现不必要的继承关系。同时,也需要注意派生类与基类之间的访问权限,避免访问控制失效。更多文章可以关注公众号QStack。

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688