C++继承

发布于 2023-04-28  473 次阅读


1.基本语法

class 子类名 : 继承方式 基类A,继承方式 基类B...... 
{
};

2.继承方式

继承关系

public - 类外可以访问 子类可以访问

private - 类外不能访问 子类不能访问

protected - 类外不能访问 子类可以访问

3.继承规则

3.1 对象模型

子类占用内存的大小=子类变量占用的内存+基类变量占用的内存(无论子类是否可以访问基类变量 都占用内存)

3.2 构造/析构顺序

先构造基类 再构造子类 析构按照栈先入先出的原则

3.3 继承同名成员处理方式

对于子类同名成员 可以直接进行访问

对于父类的同名成员 需要添加作用域进行访问

对于多继承中的同名同源 也需要添加作用域进行访问

class test1 : public test2
{
public:
    int m_a;
};
class test1 : public test2
{
public:
    int m_a;
};
test1 t;
//访问子类t.m_a;
//访问基类t.test2::m_a
//函数访问同理

如果子类中出现和基类同名的成员函数,子类的同名成员会隐藏掉基类中所有同名成员函数

(基类函数重载后也不能直接进行访问)

3.4 菱形继承

3.4.1 概念

两个派生类继承了同一个基类 或者某个类同时继承了两个派生类

这种继承被称为菱形(钻石)继承

3.4.2 产生问题

1.A B同时继承了N的数据 当C使用时 会产生二义性

2.A B继承来的数据是重复的 浪费内存空间

3.4.3 解决方案

利用虚继承解决菱形继承问题

//在产生菱形继承前 将两个派生类的继承添加关键子 virtual 使其变为虚继承
//此时 将N类称为虚基类
class A : virtual public N;
class B : virtual public N;