虚函数

关于C++虚函数,纯虚函数以及模板等重要概念的深入讨论(二)

不打扰是莪最后的温柔 提交于 2019-12-24 14:10:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 2.析构与虚析构函数 为了说明 基类的析构函数必须为虚析构函数 ,我们来实践一下:在A的析构函数中加入输出cout << "This is A class." << endl;同理在B的析构函数中也加入输出cout << "This is B class." << endl; 最后在main函数objectC->print();下方加入语句:delete objectC; objectC = NULL;从而销毁对象,调用析构函数。如果基类A的析构函数非虚析构的话,运行结果如下: 如果将基类A的析构函数改写为虚析构函数:virtual ~A();那么运行的结果如下: 可以清晰的看到,在基类A中如果是非虚析构函数时,销毁objectC 对象的时候则没有调用B析构函数,而若为虚析构函数的话,就会调用B的析构函数。因此为了防止释放指向子类的基类指针时,子类发生内存泄露现象,我们必须将基类的析构函数设置为虚析构! 3.虚函数与纯虚函数 虚函数即是在声明函数的时候在前面加入virtual 关键字如:virtual void print(); 而纯虚函数则是这样定义的:virtual void print() = 0; 即纯虚函数没有实体,实体是需要它的继承重写来实现的。我们来看一段实例代码: // Test1.cpp :

重拾C++之虚函数和虚基类以及抽象类

霸气de小男生 提交于 2019-12-24 14:09:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了。 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{ ... } a=A();//尼玛这都能行,被踢大了 二、虚函数和一般函数 虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果。 virtual void show(){ cout<<"hello my name is a"<<endl; } 废话不多说,为了展示虚函数和一般函数的区别看看下面一个个例子: #include<iostream> using namespace std; class A{ private: int a; int b; public: A(int a,int b){ this->a=a; this->b=b; cout<<"hello base A"<<endl; cout<<a<<'-'<<b<<endl; } //定义一个虚函数 virtual void show(){ cout<<"hello my name is a"<<endl; } }; class D:public A{

C++中的接口继承和实现继承

戏子无情 提交于 2019-12-24 14:05:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> C++中的接口继承和实现继承 很多人认为,C++中是不存在接口继承的,只有Java、C#这类语言才提供了相应的语法支持。 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承。C++中依然可以实现接口继承,只是形式上稍有不同罢了。 C++中的继承基于一个事实:父类定义的成员函数会一直被子类继承(包括被子类隐藏的部分)。 而父类中提供的函数可以有三种:1)普通成员函数 2)普通虚函数 3)纯虚函数。这三种函数类型代表了三种继承设计模式。 一个简单的实例代码如下: 01 class Shape 02 { 03 public : 04 virtual void Draw() = 0; 05 virtual int GetError(); 06 int GetId(); 07 }; 08 09 class Rectangular : public Shape 10 { 11 //... 12 }; 13 14 class Circle : public Shape 15 { 16 //... 17 }; 普通成员函数由父类声明且实现,子类应继承接口以及强制性的实现 。 这几乎是最常见的一种函数类型,代表了典型的”is-a”继承设计模式。 ps:所谓的”is-a”设计模式,指的是”

纯虚函数

和自甴很熟 提交于 2019-12-24 13:53:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 纯虚函数是指被表明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。 纯虚函数定义格式 virtual 返回值类型 函数名(参数表)= 0 含有纯虚函数的基类是不可以定义对象的 。纯虚函数无实现部分,不能产生对象,所以含有虚函数的类是 抽象类 。 //Test1.h #include<iostream> using namespace std; class Fish { public: virtual void water() = 0; virtual void eat() = 0; }; class Shark : public Fish { public: void water(); void eat(); }; void Shark::eat(){cout<<"Shark eat. "<<endl;} void Shark::water(){cout<<"Shark water. "<<endl;} void fun(Fish *f) { f->eat(); f->water(); } 纯虚函数需要注意 1. 定义纯虚函数时,不能定义纯虚函数的实现部分。即使是函数体为空也不可以,函数体为空就可以执行,只是什么也不做就返回

虚函数问题

扶醉桌前 提交于 2019-12-23 10:08:24
虚函数多态(装箱调用)只能通过指针和引用实现 # include <iostream> # include <windows.h> using namespace std ; class A { public : A ( ) { cout << "Constructing class A\n" ; } virtual void m ( ) { cout << "invoking f from class A.\n" ; } } ; class B : public A { public : B ( ) { cout << "Constructing class B\n" ; } void m ( ) { cout << "invoking f from class B.\n" ; } } ; class C : public B { public : C ( ) { cout << "Constructing class C\n" ; } void m ( ) { cout << "invoking f from class C.\n" ; } } ; class D : public C { public : D ( ) { cout << "Constructing class D\n" ; } void m ( ) { cout << "invoking f from

Scala 的 listener 模式

蓝咒 提交于 2019-12-22 19:58:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Scala 中也有虚类,相当于 C++ 的纯虚类,不能自己实例化。可以定义一个匿名的子类来实例化生成对象。匿名子类的写法是使用父虚类后面跟着大括号,在里面覆盖 override 父类的方法。 虚函数 abstract class Listener { def trigger } object scala { def main(args: Array[String]) = { var myListener = new Listener{ def trigger() {println(s"Trigger at ${new java.util.Date}")} } myListener.trigger() } } myListener 后面跟着的就是匿名子类的定义,定义的同时实例化生成 myListener。 结果打印 Trigger at Mon Dec 26 17:12:55 CST 2016 观察者模式 Listener 用来接收消息,Listening 类用来发送消息。 abstract class Listener { def trigger } class Listening { var listener: Listener = null def register(l: Listener)

C++多态性与虚函数

情到浓时终转凉″ 提交于 2019-12-22 00:51:33
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。 (一)多态性   多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数。 1)多态的分类   广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制重载(类型强制转换),类型参数化多态(模板) ,包含多态(继承与虚函数)四种方式来实现。类型参数化多态和包含多态称为一般多态性,是用来系统地刻画语义上相关的一组类型;重载多态和强制多态性称为特殊多态性,用来刻画语义上无关连的类型间关系。   C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能够确定,因此虚函数是多态性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向对象的程序设计中使用很频繁。 2)静态联编   联编又称为绑定,就是将模块或函数合并在一起生成可执行代码的处理过程,同时对每个模块或函数分配内存地址,对外部访问也提供正确的内存地址。   在编译阶段就将函数实现与函数调用绑定起来称为静态联编

C++中的虚函数和纯虚函数用法

旧时模样 提交于 2019-12-21 10:53:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class) 只有声明而没有定义。 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。 5. 虚函数的定义形式:virtual {method body} 纯虚函数的定义形式:virtual { } = 0; 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。 6. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC

封装继承多态到底讲的是什么

青春壹個敷衍的年華 提交于 2019-12-21 09:03:18
封装继承多态到底讲的是什么 封装、继承、多态并不是针对C#语言提出来的,他是一个在面向对象思想下产生的一个概念。所以想要弄明白封装、继承、多态,首先就要先了解面向对象概念。封装:当我们提及面向对象的时候,这个对象怎么来?就是通过我们人为的封装得来。封装就是把一些特征或功能组合到一个抽象的对象上。就比如说电脑:它的特征是有一个显示屏,有一个主机,有鼠标和键盘等等。功能有计算等。那我们把这些特征和功能组合到“电脑”这个抽象的名词上时,“电脑”于是就有了这些特征和功能。但这个“电脑”不是实物,它代表所有名叫“电脑”的实物的名称。在C#中,我们把封装好的抽象的名词叫"class",所以我们称“电脑”叫一个类(class),而实体电脑叫这个类的对象(或者叫实例)。 而继承、多态则是类的特性。 继承:这个词就用正常的语义来解释就可以了,比如说你继承了你父亲的优点。而在C#中类也是可以继承的(单继承),比如说我们有了“电脑”这个类,现在我们再定义一个类叫“联想电脑”,难道我们要把电脑的特征、功能再定义一遍?可以是可以的,但是这样一方面代码有点重复,另一方向也不方便管理和说明“联想电脑”的特征。所以我们可以让“联想电脑”继承于“电脑”这个类,我们称“联想电脑”为“电脑”的子类或派生类,而“电脑”叫做父类或基类。这样,只要“电脑”有的东西,“联想电脑”都有,但是“联想电脑”还可以进化出(再添加

cvte面试c++总结

妖精的绣舞 提交于 2019-12-21 05:07:51
在C++中,源程序变为可执行程序的正确顺序 编辑、编译、链接、执行 虚函数,纯虚函数,多态性 1、纯虚函数(pure virtual)纯虚函数的定义形式:virtual { } = 0;纯虚函数就是 基类只声明函数体 ,没有实现过程。时对子类的约束,是接口继承。 2、虚函数(Impure virtual)虚函数的定义形式:virtual {method body};c++的虚函数是 基类提供虚函数的实现 ,为子类提供默认的函数实现。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。 3、抽象类含有纯虚函数的类被称作抽象类,而 只含虚函数的类不能被称作抽象类 。抽象类是不能使用new创建新对象的,也就是抽象类不能被实例化,只有抽象类的派生类才可以用new创建对象。 4、多态性多态性是指相同对象收到不同消息或者不同对象收到相同消息时产生不同的实现动作。c++支持两种多态性: 编译时多态性、运行时多态性 。编译时多态性:通过重载函数实现。运行时多态性:通过虚函数实现。 一、定义 纯虚函数是在基类中声明的虚函数 ,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法