c++继承

目录

什么是继承

继承的语法

 继承的作用域:父子成员函数隐藏

继承派生类的构造函造父类成员变量需要调用父类的构造函数

继承派生类的拷贝构造也要调用其父类的拷贝构造 

构造的时候先父后子,析构先子后父

 虚继承指针偏移量设计


什么是继承

在C++中,继承(inheritance)允许一个类(称为子类或派生类)从另一个类(称为基类或父类)继承属性和行为。这种关系被称为"is-a"关系,表示派生类是基类的一种特殊类型。

通过继承,派生类可以获得基类的成员变量和成员函数,而无需重新编写相同代码。派生类可以添加自己的特定数据和成员函数,并重写基类中的方法以满足特定需求。

继承的语法

c++继承_第1张图片

其中,访问修饰符可以是publicprotectedprivate,用于指定派生类对基类成员的访问级别。

  • public:表示派生类内部和外部均可访问基类的公有成员。
  • protected:表示派生类内部可访问基类的保护成员,外部不可访问。
  • private:表示派生类内部可访问基类的私有成员,外部不可访问。

 c++继承_第2张图片

 继承的作用域:父子成员函数隐藏

  1. 成员函数的隐藏(Member Function Hiding):
    • 如果在派生类中定义了与基类同名的成员函数,则基类的成员函数将被隐藏。
    • 当通过派生类对象调用该成员函数时,只会调用派生类中的函数,而不会调用基类中同名的函数。

下面是一个示例代码:

c++继承_第3张图片

在上述示例中,Derived类继承了Base类,并重定义了func()函数。

main()函数中创建了Derived类的对象derived,并通过对象调用了成员函数func()。由于派生类中定义了同名的成员函数,因此会调用派生类的函数。

继承派生类的构造函造父类成员变量需要调用父类的构造函数

继承派生类的拷贝构造也要调用其父类的拷贝构造 

c++继承_第4张图片

构造的时候先父后子,析构先子后父

  1. 构造函数的执行顺序:

    • 在派生类的构造函数中,首先会自动调用基类的构造函数来初始化基类的成员变量。
    • 派生类的构造函数在调用基类构造函数后,再依次执行自己的构造过程。
  2. 析构函数的执行顺序:

    • 在派生类的析构函数中,首先会先执行派生类自己的析构过程。
    • 然后自动调用基类的析构函数来销毁基类的成员变量。

这种先构造父类后构造子类、先析构子类后析构父类的顺序,确保了子类可以访问到完整的父类资源,并且能够安全地释放所有的资源。

以下是一个示例代码,展示了构造和析构的顺序

c++继承_第5张图片

 虚继承指针偏移量设计

虚继承(virtual inheritance)是用于处理多重继承中的菱形继承问题的一种机制。虚继承可以避免由多个派生类直接或间接继承同一个基类而导致的二义性和资源浪费。

c++继承_第6张图片

当使用虚继承时,编译器会为每个包含虚基类的派生类生成一个称为虚基类指针(vptr)或虚基类表(vtable)的特殊指针。这个指针存储了相对于派生类对象起始地址的偏移量,以及用于访问虚基类的额外信息。虚基类指针通过这个偏移量来定位虚基类的位置。

具体的偏移量设计实现是由编译器完成的,通常不需要手动干预。编译器会确保派生类对虚基类的访问是正确的,并自动进行指针偏移量的计算和调整。

下面是一个简单示例代码,演示了虚继承的使用:

c++继承_第7张图片

c++继承_第8张图片

你可能感兴趣的:(开发语言)