摘要:
动态转换 不可以转换基础数据类型 父子之间可以转换 父转子 不可以 子转父 可以 发生多态 都可以 1.基础类型不可以转换 2.父子关系 向上转 可以 向下转 不安全就不可以 注意: dynamic_cast如果发生了多态,那么可以让基类转成派生类,向下转换 #define _CRT_SECURE_ 阅读全文
摘要:
静态转换 使用方式 static_cast< 目标类型>(原始数据) 可以进行基础数据类型转换 父与子类型转换 没有父子关系的自定义类型不可以转换 1.普通类型 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace s 阅读全文
摘要:
难点 1.不注意普通函数加上template<> 就成了模板函数, 而友元函数声明的时普通函数, 找不到普通函数的实现链接 err1 2.类内声明了模板函数,但此时声明因为有 <>所以编译器看不到,需要在这之前先声明函数 3.声明了函数还是会报错,因为函数中的参数 Person类并没有声明,所以还要 阅读全文
摘要:
友元函数类内实现 friend void printPerson( Person<T1 ,T2> & p ) 友元函数类外实现 friend void printPerson<>(Person<T1, T2> & p); //没有<>普通函数 声明 加上 <>模板函数声明 让编译器看到 函数 并且看 阅读全文
摘要:
分文件解决 .h .cpp分别写声明和实现 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令 解决方案 保护 .cpp文件 (不推荐) 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp 约定俗成的 (.hpp文件即分文件模板 阅读全文
摘要:
1. template <class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using n 阅读全文
摘要:
基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉,那么无法分配内存,编译不过 利用参数列表class Child :public Base<int> #define _CRT_SECURE_NO_WARNINGS #include <iostream> using nam 阅读全文
摘要:
1. typeid(T).name(); //可以查看泛型传入的时什么类型数据 阅读全文
摘要:
三种方式 显示指定类型 参数模板化 整体模板化 实例: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //类模板 template<class NameT, cla 阅读全文
摘要:
类模板 语法:template <T…> 紧跟着是类 区别: 与函数模板区别,可以有默认类型参数 函数模板可以进行自动类型推导,而类模板不可以 类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建 #define _CRT_SECURE_NO_WARNINGS #include <iostr 阅读全文
摘要:
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 构造函数中 会将虚函 阅读全文