虚函数

【c++基础】c++常见面试问题

匿名 (未验证) 提交于 2019-12-02 23:39:01
1、const 2、static 3、volatile 4、extern 5、new & malloc 6、delete & delete[] 7、strlen & sizeof 8、内存对齐 9、零值比较 10、指针和引用的区别 11、指针与数组 12、指针类型问题 13、智能指针是怎么实现的?什么时候改变引用计数? 构造函数中计数初始化为1; 拷贝构造函数中计数值加1; 赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一; 析构函数中引用计数减一; 在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。 share_prt与weak_ptr的区别? 14、c++多态性和虚函数表 C++多态的实现? 虚函数的作用? 虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。 动态绑定是如何实现的? 静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。 虚函数表 虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的? 编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。 纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数

【C++】继承和多态――虚函数和纯虚函数

匿名 (未验证) 提交于 2019-12-02 23:32:01
一、虚函数 虚函数定义: 虚函数指针的优先级最高 虚基类的作用: 虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。 声明虚基类的一般形式: class 派生类名:virtual 继承方式 基类名 成为虚函数的条件: 虚函数表(编译期间) (一个类) 1、那些函数可以成为虚函数,哪些不能? (不能,因为没有依赖对象调用) (不能,没有依赖对象调用) (不能,因为不能取地址) 3、基类和派生类中的析构函数满足同名覆盖的关系 4、基类指针指向派生类对象(派生类对象中的起始部分)的时候,基类中的析构函数设为虚函数? 避免资源泄漏 5、对象的虚函数指针什么时候指向虚表的? 二、纯虚函数 声明纯虚基类的一般形式: virtual 函数类型 函数名 (参数表列) = 0; 拥有纯虚函数的类为抽象类(抽象类不能生成对象),通过引用或者指针来实现 class Person { virtual void display() //虚函数 { cout<< <<endl; } virtual void Display () = 0; // 纯虚函数 protected : string _name ; // 姓名 }; class Student : public Person {}; (1)纯虚函数没有函数体; (2)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用

虚函数---类的成员函数

匿名 (未验证) 提交于 2019-12-02 23:26:52
虚函数―类的成员函数 说明:在成员函数前面添加virtual关键字 ----那么这个函数就成员了虚函数 如果一个类中存在虚函数,那么这个类的对象中包含一个虚表(虚表首地址) 虚表在对象空间的开始位置 class Data { public: Data(){} ~Data(){} virtual void show(){}//虚函数 virtual void info(){} protected: int data; }; 如果对象调用的是虚函数,那么会查询虚表,再根据虚表中的函数指针执行 纯虚函数 定义:函数不需要实现, 在函数声明后面赋值为0 virtual void info()=0; 特点:如果一个类中包含纯虚函数,那么这个类就是抽象类(不能创建对象) 抽象类被派生出子类,如果在子类中没有把父类的中纯虚函数全部实现, 那么子类还是抽象类 虚函数+继承 -----实现 多态 虚函数, 继承, 在子类中重新实现父类的虚函数, 把子类地址赋值给父类指针, 通过父类指针类调用虚函数(根据虚表来查询调用) 虚函数默认参数 class Base { public: virtual void show(int b=321) { } protected: int data; }; class Child:public Base { public: void show(int c=123) {

python: 多态与虚函数;

匿名 (未验证) 提交于 2019-12-02 22:56:40
通过python的abc模块能够实现虚函数; 例子 : #!/usr/bin/python #coding=utf-8 from abc import ABCMeta, abstractmethod class Base(): __metaclass__=ABCMeta          #必须先声明 def __init__(self): pass @abstractmethod              #虚函数 def get(self): print ‘base get‘ pass class Derivel(Base): def get(self): print "Derivel get" class Derivel2(Base): def get(self): print "Derivel2 get" A = Derivel() B = Derivel2() A.get() B.get() 原文:https://www.cnblogs.com/yinwei-space/p/9275810.html

Java虚拟机--对象模型

匿名 (未验证) 提交于 2019-12-02 21:53:52
   让我们思考这样一个问题 :一个Java对象如何在基于c++实现的系统中运行?对象在JVM内部是如何表示的?它在内存中是如何存储的...... 1.OOP-Klass 二分模型   Java是面向对象的语言,面向对象有三个特征:封装、继承和多态。而HotSpot基于C++实现,C++也是面向对象的语言,那这样的话为每一个Java类生成一个C++类不就OK了吗?事实并不是这样,对象在JVM内的表示被设计成了一种新的表示方式:OOP-Klass 二分模型:   ■ OOP :或OOPS,即普通对象指针,用来描述对象实例信息。   ■ Klass :Java类的C++对等体,用来描述对象实例的具体类型。    为什么要设计这样的模型呢?原因: HotSpot JVM的设计者不想让每一个对象中都含有一个vtable(虚函数表)。 2.OOP-Klass模块:              模块说明如下:                          OOP   上面列出的是整个Oops模块的体系结构,其中包含多个子模块,每个子模块对应一个类型,每一个类型的OOP都代表一个在JVM内部使用的特定对象类型。 在Java应用程序运行过程中,每创建一个Java类对象,在JVM内部也会相应的创建一个OOP对象来表示Java对象 。OOPS类的共同基类型为oopDesc

1.6 C++学习之多态&虚函数&文件操作

回眸只為那壹抹淺笑 提交于 2019-12-02 15:11:07
文章目录 多态 基本概念 多态原理 实例:计算器类 纯虚函数和抽象类 实例:制作饮品 虚析构和纯虚析构 案例:电脑组装 文件操作 文本文件 写文件 读文件 二进制文件 写文件 读文件 多态 基本概念 多态是面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运行阶段确定函数地址 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字,变成虚函数,那么编译时不能确定函数调用了,运行时才确定 virtual void speak() { cout << "动物在说话" << endl; } }; class Cat :public Animal { public: void speak() { cout << "小猫在说话" << endl; } }; class Dog :public Animal { public: void speak() { cout << "小狗在说话" << endl; } }; //我们希望传入什么对象,那么就调用什么对象的函数 //如果函数地址在编译阶段就能确定,那么地址早绑定,即静态联编 /

《C++ 习题与解析》笔记

人盡茶涼 提交于 2019-12-02 14:53:46
目录 ####Chapter-1 C++语言概述(错题) ####Chapter-2 类和对象 ####Chapter-3 引用 ####Chapter-4 友元函数 #### Chapter-5 运算符重载 #### Chapter-6 继承与派生(错题) #### Chapter-7 多态性和虚函数 #### Chapter-8 异常处理 C++基础: 基础数据类型,简单输入输出,流程控制语句,函数与编译预处理,数组,结构体,指针与引用 C++面向对象部分: 类与对象,构造和析构函数,继承与派生,友元,虚函数,静态成员,运算符重载 Chapter-1 C++语言概述 位运算操作符 单目:~(按位求反) 双目:&(与)、 |(或)、 ^(按位异或) 移位运算符 << (左移): 左移是将一个二进制数按指定的位数向左移位,移掉的位被丢弃,右边移出的空位一律补0 >> (右移): 右移是将一个二进制数按指定的位数向右移位,移掉的位被丢弃,左边移出的空位一律补0,或补符号位 逗号运算符 d1, d2, d3, d4: 计算一个逗号表达式的值时,从左至右依次计算各个表达式的值,最后计算的一个表达式的值和类型便是整个逗号表达式的值和类型 二维数组指针表示 //输出对应的值的三种方法 int b[2][3]; a. *(*(b+i)+j) b. *(b[i]+j) c. *(&b[0][0]

C++虚函数详解

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

重载与多态

…衆ロ難τιáo~ 提交于 2019-12-02 13:07:53
多态的类型 :分为4类,重载多态,强制多态,包含多态,参数多态。 以前所学过的普通函数的重载也属于重载多态。强制多态是指将一个变元的类型加以变化,以符合一个函数或操作的要求,比如int型与float型相加,要先进行类型转换。 多态的实现 :分为两类,编译时的多态与运行时的多态。 前者在编译的过程中确定了同名的具体操作对象,而后者是在程序运行过程中才多态地确定操作所指向的对象。这种确定操作具体对象的过程就是绑定。绑定工作在编译连接阶段完成的情况为 静态绑定 ,在程序运行过程中完成的情况是 动态绑定 。 运算符重载 运算符重载时对已有的运算符赋予多重含义,使同一个运算符作用于不同的数据类型时有不同的行为。 重载形式 重载为类的非静态成员函数,重载为非成员函数。 两种重载方式的声明语法形式一般相同 都为 返回类型 operator 运算符(形参表) { 函数体 } 非成员函数一般定义为友元函数。 **实现‘+’的重载** #include<iostream> using namespace std; class counter { private: float a; public: counter(float a=0):a(a){} counter operator+(counter& c)const { **//定义为类的非静态成员函数** return counter(a + c.a

多态性总结

青春壹個敷衍的年華 提交于 2019-12-02 12:47:41
  多态从实现的角度可以划分为:编译时多态和运行时的多态。 运算符重载   运算符重载即静态多态,是对已有的运算符赋予多重含义,运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字 operator 和其后要重载的运算符符号构成的。把指定的运算表达式转化为对运算符函数的调用,运用对象转化为运算符函数的实参。 • 运算符重载格式 函数类型 operator运算符 (形参){ …… } • 运算符重载规则 当重载为类的成员函数的情况,形式参数个数=原操作数个数-1(后置++、--除外)。 当重载为类友元函数的情况,形式参数个数=原操作数个数。 除了类属关系运算符 "." 、成员指针运算符 ".*" 、作用域运算符 "::" 、sizeof 运算符和三目运算符 "?:" 以外,C++ 中的所有运算符都可以重载。 重载运算符限制在 C++ 语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。 //复数类成员函数自增 #include<iostream> using namespace std; class complex{ private: int real,imag; public: complex(int r,int i){ real=r; imag=i; }