C++primer学习笔记(六)

Stella981
• 阅读 646
  1. virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。根类一般要定义虚析构函数。

  2. 派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。用做基类的类必须是已定义的。

  3. 存在虚函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。可以使用域操作符强制调用基类虚函数【虚中调虚】。基类虚函数和派生类的默认实参要一致。

  4. 派生类继承基类的访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类的用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。

  5. 友元关系不继承。

  6. 派生类指针可自动转换到基类指针,反之不行。如果知道基类到派生类的转换【这种转换是基类地址赋给派生类指针】是安全的【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。dynamic_cast是在运行时进行检查。

  7. 构造函数无法继承,派生类构造数还要初始化基类【否则只能用合成构造函数初始化】。初始化列表和初始化的顺序无关。只能初始化直接基类。

  8. 赋值操作符必须防止自身复制【赋值之前会先释放自身的内容,万一是自己, 那不就丢失了】。派生类析构函数不负责清除基类成员,每个析构函数只负责清除自己成员。派生类指针的静态类型和动态类型不一致时【基类指针指向派生类是时】,为保证删除指针调用合适的析构函数【多态】,基类析构必须为virtual。

  9. 构造函数是对象动态类型确定之前运行的,不需要定义为virtual。

  10. 引用、对象、指针的静态类型决定了能够完成的行为,动态类型有多的功能也无法使用。派生类应避免与基类成员名字冲突。局部作用域中声明的函数不会重载全局域的函数。派生类定义的函数也不重载基类函数【想重载要么不定义,要么全定义】。using作用域。

  11. 纯虚函数==抽象类==无法创建对象  派生类对象复制到基类时派生类对象将被切掉【而指针和引用不会】。

  12. 对象不支持动态绑定,指针和引用支持但使用起来麻烦,解决方法是定义包装类或句柄类【提供到其它类接口的类】。像使用指针一样使用句柄而不用管理它指向的对象。类似智能指针的方法建立指针句柄。

  13. 关联容器的构造函数是我们能够提供比较函数的名字:std::multiset<Sales_item, Comp【比较器】> items(compare【比较函数】);

  14. template 模板定义以关键字template开始【旧程序中可能用class】,后接模板形参表,模板形参表是由尖括号扩住的一个或多个模板形参的列表,以逗号分隔。表中可以有非类型形参,实例化时绑定值。

  15. 通过在成员前面加上typename告诉编译器将成员当做类型。泛型代码两个原则:1.模板形参是const引用 2.函数体中只用<比较

  16. 模板形参数量自由,可以设定返回值为一个形参。显示提供实参:long a=sun(i, lng)

  17. export关键字能够指明给定的定义可能会需要在其他文件中产生实例化。非类型形参的模板实参:template<int hi, int wid> 实例化时必须是常量表达式 Screen<24,80>

  18. 模板中的友元表示任何实例可以访问任何实例。模板类中可以有模板类成员。

  19. 模板类中的static成员由同一实例化的对象共享,但不同模板形参的实例化对象间不共享。

  20. 模板特化:template<> 模板名<模板形参>函数形参表 函数体   特化类 也可以只特化类中某个成员  部分特化:多个模板形参,特化某个形参【编译器会优先选择特化的】。匹配同样好时,非模板版本优先。

本文分享自微信公众号 - MySQL从删库到跑路(cskdpl)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java实现多态中的虚函数相关概念
本文转载自参考博客1\.Java虚函数虚函数的存在是为了多态。C中普通成员函数加上virtual关键字就成为虚函数Java中其实没有虚函数的概念,它的普通函数就相当于C的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数PS:其实C和Java在虚函
Wesley13 Wesley13
2年前
C++中基类虚析构函数的作用及其原理分析
虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏。故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual。知识背景     
Wesley13 Wesley13
2年前
C++基类的析构函数定义为虚函数的原因
1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数;基类指针可以指向派生类的对象(多态),如果删除该指针delete\\p,就会调用该指针指向的派生类的析构函数,而派生类
Wesley13 Wesley13
2年前
C#中虚函数和抽象函数的区别
抽象方法:使用abstract关键字例如:publicabstractboolWithdraw(…);抽象方法是必须被派生类覆写的方法。抽象方法是可以看成是没有实现体的虚方法,如果类中包含抽象方法,那么类就必须定义为抽象类。不论是否还包含其它一般方法。虚方法:使用virtual关键字publicvirtual
Wesley13 Wesley13
2年前
DLL如何导出类?
其实最好是写一个父类,把要实现的函数全部以虚函数的形式写在父类中,然后写一个子类,继承父类,重写父类的虚函数。这样的话就安全得多了。其次就在DLL中导出一个函数,返回父类的一个对象指针,再在EXE中动态链接DLL,调用导出函数。例子如下://以下是DLL的代码//class\_a.hclass A{public:
Wesley13 Wesley13
2年前
C++中初始化的顺序问题
C的初始化顺序非常重要,牢记才能不出常识性的错误。其初始化顺序为:1类中的static成员是最先初始化的,这个是先于main函数的执行的,但是必须注意,如果这个成员只是在类中声明,而没有在类外边进行定义的话,那么这个是不会开辟内存的,是不会初始化的。2调用基类的构造函数。但是基类分为两种顺序,特别注意。一种是虚继承的基类;另一种是普通继承
Stella981 Stella981
2年前
Boost Python官方样例(三)
导出C类(纯虚函数和虚函数)大致做法就是为class写一个warp,通过get\_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用纯虚函数编写C函
Wesley13 Wesley13
2年前
C++多态学习之向下强制类型转换
向下强制类型转换在C中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派