C++继承,静态成员,const成员

2020-11-05  本文已影响0人  lieon

继承

继承的方式有三种

访问权限 public protected private
对本类 可见 可见 可见
对子类 可见 可见 不可见
对外部(调用方) 可见 不可见 不可见

继承中的对象模型

struct Person {
public:
    int m_A;
protected:
    int m_age;
private:
    int m_B;
};

struct Student: public Person {
    int m_no;
};

Student 对象占用16个字节

继承中构造和析构的顺序

继承中访问同名的成员

多继承

C++允许一个类可以有多个父类

class Student {
public:
    int m_score;
    
    void study() {
       cout << "Student::study" << endl;
    }
};

class Workder {
public:
    int m_salary;
    
    void work() {
        cout << "Workder::work" << endl;
    }con
};

class Undergraduate: public Student, public Workder {
public:
    int m_grade;
    
    void play() {
        cout << "Undergraduate::play" << endl;
    }
};

多继承体系下的构造函数调用

class Undergraduate: public Student, public Workder {
public:
    int m_grade;
    
    Undergraduate(int grade, int score, int salary): Student(score), Workder(salary) {
        m_grade = grade;
    }
};



## 多继承-虚函数
- 如果子类继承多个父类都有虚函数,那么子类对象就会产生对应的多张虚表
  - ![image.png](https://img.haomeiwen.com/i5456635/938814dd437afbe3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)

## 同名函数,同名成员变量

```C++


class Student {
public:
    int m_score;
    int m_age;
};

class Workder {
public:
    int m_salary;
    int m_age;
};

class Undergraduate: public Student, public Workder {
public:
    int m_grade;
    int m_age;
    Undergraduate(int grade, int score, int salary): Student(score), Workder(salary) {
        m_grade = grade;
    }
};

void test() {
    Undergraduate ug(10, 10, 1);
    ug.Student::eat();
    ug.Workder::eat();
    ug.eat();
    
    ug.Student::m_age = 29;
    ug.Workder::m_age = 29;
    ug.m_age = 29;
}

菱形继承

    class Person {
        int m_age;
    };

    class Student: public Person {
    public:
        int m_score;
    };

    class Workder: public Person {
    public:
        int m_salary;
    };

    class Undergraduate: public Student, public Workder {
    public:
        int m_grade;
    };

虚继承

image.png
class Student: virtual public Person {
public:
    int m_score;
};

class Workder: virtual public Person {
public:
    int m_salary;
};

class Undergraduate: public Student, public Workder {
public:
    int m_grade;
};
image.png image.png
class Sleep: virtual public Animal { };

class Tuo: virtual public Animal { };

class SleepTuo: public Sleep, public Tuo { };

/*
 Sleep 和 Tuo中通过虚继承存储的是一个vbptr(虚基类指针),该指针分别指向一个Sleep和Tuo的一个虚表,该虚表存储的是SleepTuo中一个地址偏移量
 ,通过该偏移量和vbptr的起始地址,得到最终指向的地址
 Sleep的vbptr指向: 0(起始值)+ 8(偏移量)= 8
 Tuo的vbptr指向: 4(起始值)+ 4(偏移量) = 8
 
 */

静态成员

静态成员的访问方式

Perosn::m_age = 30;
Perosn p;
p.m_age = 0;
class Car {
    int m_price;
    static int ms_count;
public:
    static int getCount() {
        return ms_count;
    }
    
    Car(int price = 0): m_price(price) {
        ms_count++;
    }
    
    ~Car() {
    }
};

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

class Rocket {
private:
   static Rocket* ms_instace;
   Rocket() { }
   Rocket(const Rocket &rocket) { };
   Rocket &operator=(const Rocket &rocket) { return *this; };

public:
   static Rocket* shared() {
       // 严格要讲,这段代码需要考虑线程安全的问题
       if (ms_instace == nullptr) {
           ms_instace = new Rocket();
       }
       return ms_instace;
   }
};

Rocket* Rocket::ms_instace = nullptr;

const成员

class Car {
    const int mc_wheelsCount = 20;
public:
    Car(): mc_wheelsCount(10) {};
    
    void run() const {
        std::cout << "run()" << std::cout;
    }
};

引用类型成员

class Car {
    int age;
    int m_price = age;

public:
    Car(int &price): m_price(price) {};
};
上一篇下一篇

猜你喜欢

热点阅读