继承

赋值兼容性原则:子类是一中特殊的父类 子类可以当父类使用

如果父类和子类定义的数据成员重名,如何确定调用哪个?

#include "iostream"

using namespace std;

class A

{

public:

int a;

int b;

A(int a = 0, int b =0)

{

this->a = a;

this->b = b;

}

private:

};

class B : public A

{

public:

B(int a = 2, int b =2)

{

this->a = a;

this->b = b;

}

void add()

{

a++;

A::b++; //给A中的b++

//b++给B中的b++

}

int b;

protected:

private:

};

void main()

{

A a;

B b;

b.add();

cout<<b.b<<"  "<<b.A::b; //运行结果是2 1

system("pause");

}

静态成员

基类定义的静态成员可以被所有派生类共享!!!

根据静态成员的自身访问特性派生类的继承方式,在类层次上有不同的访问性质

派生类中访问静态成员:

             类名::成员

             对象名::成员

继承中的构造析构

1 子类构造的时候会触发父类构造函数,因此可以用父类构造函数初始化子类,因为类的构造顺序是先构造父类再构造子类(父类的属性应该由父类初始化,子类新加的属性应该由子类初始化父子分工)

初始化列表可以初始化类中的组合对象也可以使用父类初始化子类 

调用规则:

子类构造时,需要调用父类的构造函数对其继承来的属性进行初始化

子类析构时,需要调用父类的析构函数对其继承来的属性进行析构

先创建的后释放(父类构造->子类构造->子类析构->父类析构)

总结:构造父类时先检查父类有没有静态属性,如果有,先调用静态属性的语句,然后检查子类有没有静态属性,然后调用父类普通变量构造函数,最后调用子类普通变量构造函数

继承中的混搭风

先构造父类,再初始化类中组合对象,最后初始化自己

extern是全局变量声明,只要声明全局变量就默认前面加extern

如果本文件想要引用别的文件中的全局变量一定要加上extern声明一下

int b = 2;  //如果加static后面就不能用

#include ”myfun.c ” //相当于将定义替换

extern int b;

案例a.cpp文件

//把所有的全局变量都放在一块,统一管理

//只定义一次

int g_aa = 10;

int g_aa2 = 10;

int g_aa3 = 10;

a.h文件

#pragma once

//extern 修饰全局变量,提升该变量可以 跨文件

extern int g_aa ;

extern int g_aa2;

extern int g_aa3;

       main.cpp文件

#include "iostream"

#include "a.h"

using namespace std;

void main()

{

cout<<g_aa<<endl;

system("pause");

}

静态成员不可以写在构造函数中!!!

class A

{

public:

A()

{

//cout<<&(A::c)<<endl; 如果static不初始化,则无法编译通过,因为类还没有分配内存,只有构造了才分配内存,而构造之前又需要检查static int c,他没初始化,没有内存

}

int a;

static int c;

 

void mm()

{

cout<<&(A::c)<<endl;

}

protected:

int b;

private:

};

int A::c = 100; 

多继承

class 派生类名:访问控制 基类名1访问控制 基类名1访问控制 基类名n{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值