函数模板的局限性级解决方法(第三代具体化)
摘要:1. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class Person { public: Person(string name, int age) { th
阅读全文
模板实现机制
摘要:函数模板机制结论: 编译器并不是把函数模板处理成能够处理任何类型的函数,模板不是万能的,不能通用所有的数据类型 函数模板通过具体类型产生不同的函数,模板并不能直接调用,生成后的模板函数才可以调用 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编
阅读全文
函数模板与普通函数的区别以及调用规则
摘要:区别 普通函数可以进行隐式类型转换 模板不可以 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //1.普通函数和函数模板的区别 template<class T> T myPlus(T a, T b)
阅读全文
函数模板基本用法及泛型
摘要:函数模板 template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错 mySwap( T &a T &b ) 类型也需要传入 ,类型参数化 myswap(a,b) 自动类型推导 按照a b的类型 来替换T myswap<int>(a,b) 显示指定类型 实例:
阅读全文
向上类型转换和向下类型转换
摘要:1. 基类转派生类 向下类型转换 不安全的 派生类转 基类 向上类型转换 安全 如果发生多态 总是安全的 父类中如果写了虚函数,而子类没有任何重写,有意义吗? 没有意义
阅读全文
虚析构和纯虚析构
摘要:虚析构 virtual ~类名() {} 解决问题: 通过父类指针指向子类对象释放时候不干净导致的问题 纯虚析构函数 写法 virtual ~类名() = 0 类内声明 类外实现 如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化对象 不用虚析构的化,delete子类的时候,只会调用父类的析构
阅读全文
纯虚函数和抽象类
摘要:纯虚函数 仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象 抽象类 在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class). 纯虚函数使用关键字virtual,并在其后面加上=0。如果试图去实例化一
阅读全文
多态原理
摘要:解析 当父类中有了虚函数后,内部结构就发生了改变 内部多了一个 vfprt virtual function pointer 虚函数表指针 指向 vftable 虚函数表 父类中结构 vfptr &Animal::speak 子类中 进行继承 会继承 vfptr vftable 构造函数中 会将虚函
阅读全文
静态联编和动态联编即多态的概念
摘要:多态的成立条件 有继承 子类重写父类虚函数函数 返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外) 子类中virtual关键字可写可不写,建议写 类型兼容,父类指针,父类引用 指向 子类对象 多态分类 静态多态 函数重载 动态多态 虚函数 继承关系 c++支持编译时多态(静态多态)和运行
阅读全文
虚基类的内部工作原理
摘要:1。对照表来看 代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Animal { public: int m_Age; }; //虚基类 Sheep class Sheep:virt
阅读全文
菱形继承问题的解决方案--虚基类
摘要:菱形继承解决方案 利用虚继承 操作的时共享的一份数据 sheepTuo内部结构 vbptr 虚基类指针 v:virtual b:base p:pointer 指向一张 虚基类表 通过表找到偏移量 找到共有的数据 如图:类Sheep和Tuo保留的只是虚函数指针,只有Animal里才有数据 实例: #d
阅读全文
菱形继承(钻石继承)
摘要:两个派生类继承同一个基类而又有某个类同时继承者两个派生类,这种继承被称为菱形继承,或者钻石型继承。 这种继承所带来的问题: 羊继承了动物的数据和函数,鸵同样继承了动物的数据和函数,当草泥马调用函数或者数据时,就会产生二义性。 草泥马继承自动物的函数和数据继承了两份,其实我们应该清楚,这份数据我们只需
阅读全文
多继承
摘要:同时继承多个基类 class A : public B1, public B2,…. 引发二义性问题 想解决二义性问题,就需要通过作用域来进行区分 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; cla
阅读全文
非自动继承的函数
摘要:1.构造函数 2.析构函数 3.operator=
阅读全文
继承中的静态成员的处理
摘要:类似非静态成员函数处理 如果想访问父类中的成员,加作用域即可 1.子类可以继承静态成员属性 如果有重名静态成员,就近原则 静态成员方法 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Bas
阅读全文
继承中的同名处理(就近原则)
摘要:处理方法 当子类成员和父类成员同名时,子类依然从父类继承同名成员 如果子类有成员和父类同名,子类访问其成员默认访问子类的成员(本作用域,就近原则) 在子类通过作用域::进行同名成员区分(在派生类中使用基类的同名成员,显示使用类名限定符) 成员属性 直接调用先调用子类,如果想调用父类 需要作用域 成员
阅读全文
继承中的构造和析构
摘要:调用原则: 子类对象在创建时会首先调用父类的构造函数 父类构造函数执行完毕后,才会调用子类的构造函数 当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数 析构函数调用顺序和构造函数相反 1.顺序 1.1 子类创建对象时,先调用父类的构造,然后调用自身构造 1.2 析构顺序
阅读全文
查看class数据模型的操作
摘要:1.打开vs2019开发人员命令提示 进入问价夹,dir查看文件在不在 然后输入固定语法: cl /d1 报告单个类的布局[跟类名] 属于哪个cpp文件 cl /d1 reportSingleClassLayoutSon test.cpp 可以看到
阅读全文
继承中的对象模型
摘要:1.子类中 会继承父类的私有成员,只是被编译器隐藏起来了,无法访问父类的私有成员,但是sizeof会给私有成员空间 子类会继承父类中所有的内容 ,包括了 私有属性 只是我们访问不到,编译器给隐藏了 cl /d1 reportSingleClassLayout类名 文件名 #define _CRT_S
阅读全文
继承方式
摘要:public:公有继承 protected:保护继承 private:私有继承 关系: 不管公有继承 保护 还是私有 基类中的私有属性 ,都不可以继承下去 公有继承 父类中的protected 在子类中是 protected 父类中的public 在子类中是 public 保护继承 父类中的prot
阅读全文