C++知识点总结(面向对象4-多继承, 静态成员static)

多继承1-虚函数

如果子类继承的多个父类都有虚函数, 那么子类对象就会产生对应的多张虚表.
在这里插入图片描述

同名函数

在这里插入图片描述

同名成员变量

在这里插入图片描述

多继承2-菱形继承

在这里插入图片描述
菱形继承带来的问题:
最底下子类从基类继承的成员变量冗余, 重复(有两个age, 内存是两份, 从语法上正确, 但不合理)
最底下子类无法访问基类的成员, 有二义性.

多继承3-虚继承

虚继承可以解决菱形继承带来的问题
在这里插入图片描述
Student和Worker共用一个age, 共享
从虚基类里面搞过来的成员变量都放到最后面, 这个对象会多出4个字节, 存放虚表指针, 20和12是拿来寻找age的, 拿来定位虚基类的成员变量在哪里, 因为age是共享的, 所以就要保证不管是从Worker这个类开始找还是从Student这个类开始找, 都能找到age.
在这里插入图片描述
在这里插入图片描述
Person类被称为虚基类

静态成员(static)

◼ 静态成员:被static修饰的成员变量\函数
□可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)
◼ 静态成员变量
存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存, 不在类里面
□ 对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的
必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明和实现分离(在实现.cpp中初始化)
◼ 静态成员函数
□ 内部不能使用this指针(this指针只能用在非静态成员函数内部)
□ 不能是虚函数(虚函数只能是非静态成员函数)
□ 内部不能访问非静态成员变量\函数,只能访问静态成员变量\函数
□ 非静态成员函数内部可以访问静态成员变量\函数
□ 构造函数、析构函数不能是静态
□ 当声明和实现分离时,实现部分不能带static

静态成员经典应用-单例模式

单例模式:设计模式的一种, 保证某个类永远只创建一个对象.
1.构造函数\析构函数私有化, 拷贝构造函数私有化, 赋值运算符重载函数私有化.
2.定义一个私有的static成员变量指向唯一的那个单例对象
3.提供一个公共的访问单例对象的接口.

#include <iostream>
using namespace std;

class Rocket {
private:
    Rocket() {}
    static Rocket *ms_rocket;
public:
    static Rocket *sharedRocket() {
    	// 这里要考虑多线程安全
        if (ms_rocket == NULL) {
            ms_rocket = new Rocket();
        }
        return ms_rocket;
    }

    static void deleteRocket() {
    	// 这里要考虑多线程安全
        if (ms_rocket != NULL) {
            delete ms_rocket;
            ms_rocket = NULL;
            // 防止野指针
        }
    }
    
    void run() {
        cout << "run()" << endl;
    }
};

Rocket *Rocket::ms_rocket = NULL;

int main()
{
    Rocket *p = Rocket::sharedRocket();
    p->run();
    p->deleteRocket();
    return 0;
}

(1)为什么要用指针?
1.在C++开发中, 对象能放堆空间, 尽量放堆空间.
2.对于单例对象, 要考虑内存的灵活使用, 因为牵扯到内存的分配和销毁, 所以用堆空间更灵活.
(2)赋值运算符重载函数为什么要私有化?
因为两个一样的对象做赋值操作没有意义.
(3)拷贝构造函数为什么要私有化?
因为如果不写拷贝构造函数, 还可以通过调用默认的拷贝构造函数去构建对象.如:

Rocket *p1 = Rocket::sharedRocket();
Rocket *p2 = new Rocket(*p1)

其他C++系列文章:

C++知识点总结(基础语法1-函数重载, 默认参数)
C++知识点总结(基础语法2-内联函数, const, 引用)
C++知识点总结(面向对象1-类和对象, this指针, 内存布局)
C++知识点总结(面向对象2-构造函数, 初始化列表)

C++知识点总结(面向对象3-多态)

C++知识点总结(面向对象4-多继承, 静态成员static)
C++知识点总结(面向对象5-const成员, 拷贝构造函数)
C++知识点总结(面向对象6-隐式构造, 友元, 内部类, 局部类)
C++知识点总结(其他语法1-运算符重载)
C++知识点总结(其他语法2-模板, 类型转换, C++11新特性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值