赋值兼容性原则:子类是一中特殊的父类 子类可以当父类使用 |
如果父类和子类定义的数据成员重名,如何确定调用哪个? |
#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 基类定义的静态成员,可以被所有派生类共享!!! 2 根据静态成员的自身访问特性和派生类的继承方式,在类层次上有不同的访问性质 3 派生类中访问静态成员: 类名::成员 对象名::成员 |
继承中的构造析构 |
1 子类构造的时候会触发父类构造函数,因此可以用父类构造函数初始化子类,因为类的构造顺序是先构造父类再构造子类(父类的属性应该由父类初始化,子类新加的属性应该由子类初始化,父子分工) 2 初始化列表可以初始化类中的组合对象也可以使用父类初始化子类 调用规则: 子类构造时,需要调用父类的构造函数对其继承来的属性进行初始化 子类析构时,需要调用父类的析构函数对其继承来的属性进行析构 先创建的后释放(父类构造->子类构造->子类析构->父类析构) 总结:构造父类时先检查父类有没有静态属性,如果有,先调用静态属性的语句,然后检查子类有没有静态属性,然后调用父类普通变量,构造函数,最后调用子类普通变量,构造函数 |
继承中的混搭风 |
先构造父类,再初始化类中组合对象,最后初始化自己 |
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{}; |
继承
最新推荐文章于 2025-04-11 09:02:19 发布