虚函数

C++的那些事:面向对象

人盡茶涼 提交于 2020-01-22 20:56:10
1 OOP概述 面向对象基于三个基本概念:数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。 1.1 继承 继承是派生类与基类之间的关系,它们共享了一些公共的东西,而派生类特化了一些本质不同的东西。类与类之间的继承关系构成了继承层次。在C++中,基类必须指定希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,需要在派生类中继承的不能定义为虚函数。 派生类重新定义的虚函数前面可以加virtual,但这不是必要的,在C++11中,允许派生类显式地注明它将使用哪个成员函数改写基类虚函数,只用在该函数形式参数列表后增加一个override关键字。 1.2 动态绑定 当函数接口定义了基类的引用(或指针)时,在函数内调用虚函数时,发生动态绑定。因为这时候函数实参可以为基类类型也可以为派生类类型, 虚函数只有在运行阶段 才能确定需要调用哪个定义。 2 定义基类与派生类 2.1 定义基类 基类成员函数中希望在派生类中重新定义的函数前面加了virtual,这类函数在调用时,在程序运行阶段确定。任何构造函数之外的非静态函数都可以是虚函数。virtual关键字只需要在基类定义的时候加在需要重定义的函数前面,实现的时候不需要。

20200112

假装没事ソ 提交于 2020-01-22 17:28:38
课余关注复试信息 数据驱动法 ML 两周总结 吴恩达课程学完已经算比较好了,时间不够 保证CPP课程质量,尤其是项目相关知识要扎实 有余力可以继续学数学尤其是概率论课程,吴恩达课程相关代数知识也要补足 反向传播算法 参考深度学习课程相关部分 复习正则之前知识 重点是导数项推导,一定要懂,主要分为四部分 多元梯度下降 正规方程法 逻辑回归:结果类似多元梯度下降,注意hθ(x)不同 添加正则项 神经网络的正向与反向传播 逻辑回归偏导推导: 预习多态继承 多态: 虚函数的特点:在基类/派生类的定义与重载 非成员/静态/内联/构造/友元不能设为虚函数 派生类在定义时加基类列表/类派生列表 声明时不加 访问虚函数: 指针:非虚函数判断指针类型 虚函数判断所指对象类型 引用:类似指针 但一经声明则变量变化不会改变调用函数 构造与析构: 优先调用本类中函数,次而调用基类中函数,不会调用其他派生类函数 纯虚函数 只在基类中声明,且加**=0**,称为抽象基类,不能创建抽象基类对象 派生类必须各自给出定义 另一种抽象类方式:构造函数全部为protected 一般析构函数要定义为虚函数 重载:发生在同一个类中,函数名称相同,但参数的类型、个数、顺序不同。 覆盖:发生在父子类中,同名虚函数,参数亦完全相同。(同名数据成员也有隐藏) 隐藏:发生在父子类中,指的是在某些情况下

如何实现多态

南笙酒味 提交于 2020-01-22 00:00:36
1、多态:最终表现出来的是多种形态 2、如何实现多态? 如何用C自己实现多态?,同一个函数,形参为指针或者引用,传入各个同类型的实体,然后调用各自的函数,这背后是如何调用的呢?通过虚函数,建立虚表vtable,虚表的开头都是虚函数,然后自己寻找,这样速度快 来源: CSDN 作者: Tine Chan 链接: https://blog.csdn.net/chanleoo/article/details/104066061

【C++】多态类面试题

浪子不回头ぞ 提交于 2020-01-21 14:02:40
多态类面试题 什么是多态? 答: 不同的对象完成相同的事件(具有相同的函数),产生不同的结果(函数内部实现不同)。 什么是重载、重写、重定义? 作用域 函数名、参数、返回值的要求 其它的要求 重载 两个函数在同一作用域 函数名、参数相同 重写(覆盖) 两个函数分别在基类和派生类的作用域 函数名、参数、返回值都相同 两个函数必须是虚函数 重定义(隐藏) 两个函数分别在基类和派生类的作用域 函数名相同 基类和派生类的同名函数不构成重写就是重定义 多态的实现原理? 答: 通过虚基表实现。 构造函数可以是虚函数吗? 答:不可以。因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。 析构函数可以是虚函数吗? 答:可以。但是在某一种特定的条件下,必须将析构函数定义为虚函数。(见链接)。 虚函数可不可以定义成static类型的函数? 答:不可以。虚函数的地址要存到虚表中去,static不用对象就可以调用,那么没有对象,就没有虚表指针,就找不到虚表了。没有虚表就肯定不能实现多态。没有对象,就没有this指针,所以虚函数就是为了实现出多态,定义成static静态函数就找不到虚表,实现不了多态。 内联函数不能是虚函数 正确 虚函数可以定义成内联函数吗? 答:不可以。内联函数没有地址,每次用到内联函数的时候,都是在调用的地方进行了展开,普通函数有地址,调用的时候汇编代码中就call(调用的意思

C++ primer 笔记(四)

北城余情 提交于 2020-01-21 08:45:49
第15章 object-oriented programming, OOP 面向对象编程 :数据抽象,继承,动态绑定。 通过基类的引用或指针调用虚函数时,发生动态绑定。 除了构造函数之外,任意非 static 成员函数都可以是虚函数。保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。 protected不能被外部访问,但可被派生类访问。 private继承:【Derived对象】不能调用Base中的任何东西;所有继承方式【Derived类】都还能调用Base类中的public和protected的东西(成员函数)。Derived类的Derived则都无法调用。 ----------------------------------------------------------- private继承 基类成员 private成员 public成员 protected成员 内部访问 不可访问 可访问 可访问 对象访问 不可访问 不可访问 不可访问 ------------------------------------------------------------ public继承 基类成员 private成员 public成员 protected成员 内部访问 不可访问 可访问 可访问 对象访问 不可访问 可访问 类定义中可访问,外部不可访问

C++ warning:’xxx‘ has no out-of-line virtual method definitions

我只是一个虾纸丫 提交于 2020-01-19 19:32:04
现象: 在类中定义了虚函数并且直接在类定义内部实现这些虚函数时 ,编译器就会报警告:’xxx‘ has no out-of-line virtual method definitions;its vtable will be emitted in every translation unit. 解决方法: If a class is defined in a header file and has a vtable (either it has virtual methods or it derives from classes with virtual methods), it must always have at least one out-of-line virtual method in the class. Without this, the compiler will copy the vtable and RTTI into every .o file that #includes the header, bloating .o file sizes and increasing link times 这里大概意思就是: 如果在头文件中定义了一个类并且具有vtable(它具有虚方法或者它来自具有虚方法的类), 则它必须始终在类中具有至少一个外联虚拟方法 。

C++ 虚函数表解析

[亡魂溺海] 提交于 2020-01-18 11:39:48
转自: c++虚函数 大牛的文章,就是通俗易懂,言简意赅。 前言 C++ 中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术, RTTI 技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的 C++ 的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。 当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 言归正传,让我们一起进入虚函数的世界。 虚函数表 对 C++ 了解的人都应该知道虚函数( Virtual Function )是通过一张虚函数表( Virtual Table )来实现的。简称为 V-Table 。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以

C++相关知识

烈酒焚心 提交于 2020-01-18 03:20:53
(1)一个类无虚函数并且其基类也无虚函数, 则此类无虚函数表。 (2)一个类只有成员变量和虚函数表(一个指针变量)占用存储空间。 (3)sizeof 一个空类返回长度是1。 (4)父类和子类拥有不同的虚函数表,同一个类拥有相同的虚函数表 (5)类的成员定义与实现分离, 外部使用:: 界定那个类 class Empty{ public: int a; void show(); }; void Empty::show() { cout<< "out implete"<<endl; } 来源: CSDN 作者: 小呆猪哥哥 链接: https://blog.csdn.net/weixin_42523151/article/details/103847648

c++11 中的final和override

风格不统一 提交于 2020-01-16 13:38:48
一:final 指定某个虚函数不能再子类中被覆盖,或者某个类不能被子类继承 解释: 当在虚函数声明或定义中使用时,final 确保函数为虚并指定其不可被派生类覆盖。若这么做则程序非良构(生成编译时错误)。 当在类定义中使用时,final 指定此类不可在另一类的定义中的 基类说明符列表 中出现(换言之,不能派生于它)。若这么做则程序非良构(生成编译时错误)。final 亦可用于联合体定义,此情况下它没有效果(除了 std::is_final 的输出结果),因为不能从联合体派生。 final 是在成员函数声明或类头部中使用时有特殊含义的标识符。其他语境中它未被保留,而且可用于命名对象或函数。 例子: struct Base { virtual void foo ( ) ; } ; struct A : Base { void foo ( ) final ; // Base::foo 被覆盖而 A::foo 是最终覆盖函数 void bar ( ) final ; // 错误:非虚函数不能被覆盖或是 final } ; struct B final : A // struct B 为 final { void foo ( ) override ; // 错误:foo 不能被覆盖,因为它在 A 中是 final } ; struct C : B // 错误:B 为 final { } ;

5.C++学习,面向对象编程

早过忘川 提交于 2020-01-14 02:42:53
面向对象编程 Inheritance(继承) 继承有三种,公有继承,私有继承,保护继承 继承要搭配虚函数 语法是加上黄色那行 父类的数据是完全继承下来 Derived派生类 composition(复合) 默认 Sequece是类型deque queue理由有个变量c ,变量c的类型是deque 这个class中有另外其他的模板 这两个生命期是一致的 左侧包含右边,内存的角度入下图 虚函数 父类中暂时无法实现的内容需要在子类中实现,就写虚函数,让子类去实现 对于做框架的人非常重要 Delegation(委托) composition by reference String类中有一个指针,指向另一个类 这两个声明期可能是不同步的 这种设计类型叫做编译防火墙 来源: CSDN 作者: weixin_43278150 链接: https://blog.csdn.net/weixin_43278150/article/details/103903000