首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++系列笔记(五)

首先,根本没有调用Fish::Swim() ,因为存在覆盖版本 Tuna::Swim()和 Carp::Swim() ,它们优先于被声明为函数Fish::Swim()。...,还是以局部变量方式在栈实例化,构造函数和析构函数调用顺序都相同。...抽象函数 不能实例化被称为抽象,这样只有一个用途,那就是从它派生出其他。在 C++,要创建抽象,可声明函数。...注意:C++关键字virtual含义随上下文而异(想这样做目的很可能是为了省事),对其含义总结如下: 在函数声明,virtual意味着当指针指向派生对象时,通过它可调用派生相应函数。...可将复制构造函数声明为函数吗 根本不可能实现复制构造函数,因为在方法声明中使用关键字virtual时,表示它将被派生实现覆盖,这种多态行为是在运行阶段实现

65530

C++】多态 ⑬ ( 多继承应用 “ 抽象 “ | 接口和抽象 | C++ 语言中接口实现 | 只定义 函数 抽象作接口 | )

一、多继承应用 " 抽象 " 1、接口和抽象 接口 Interface 和 抽象 AbstractClass 都是 面向对象编程 重要概念 , 借助它们可以定义一个模板 , 令其他 实现接口...语言中接口实现 C++ 语言中 , 没有接口概念 , 这里使用 " 函数 " 实现接口 ; 接口特点 : 接口 只有 函数原型 , 没有成员变量 , 函数原型 指的是 函数只有 返回值 函数名...和 参数列表 , 没有函数体 ; C++ 接口 有如下要求 : 只能定义函数 , 该类是一个抽象 ; 不能定义除函数之外其它成员 , 普通函数 , 成员变量 ; 下面的就是...virtual void pureVirtualFunction() = 0; }; 二、代码示例 - 多继承应用 " 抽象 " 在 C++ , 使用只定义了 函数 抽象 ,...作为接口 ; 借助 C++继承特性 , 继承多个 " 只定义了 函数 抽象 " , 也就是接口 ; 代码示例 : #include "iostream" using namespace

17420
您找到你想要的搜索结果了吗?
是的
没有找到

封装、继承、多态、重载:C++强大特性与代码设计

在main函数,我们分别创建了Shape对象和Rectangle对象,并调用了它们draw函数继承是一种强大代码复用工具,它可以使得之间关系更加清晰和有组织。...overload 成员函数被重载特征: 相同范围(在同一函数名字相同 参数不同 virtual关键字可有可无 overwrite 覆盖是指派生函数覆盖函数 特征是: 不同范围...派生必须实现函数,否则被看做一个抽象 对于一个没有任何接口,如果想要将它定义成抽象,只能将虚构函数声明为 通常情况下在函数不需要实现,例外是析构函数要给出实现...重载 在C++函数重载(Function Overloading)是指在同一个作用域内,可以定义多个具有相同名称但参数列表不同函数。...通过函数重载,可以根据参数类型、顺序和个数来区分不同函数,并且可以为相同操作提供不同实现。 函数重载特点如下: 函数名称相同:重载函数必须具有相同名称

21610

c#多态学习总结

c#多台方法,大体上和c++类似,但是有点区别的,这里刚刚初学,因此把重点记录下。 多态是同一个行为具有多个不同表现形式或形态能力。 多态性意味着有多重形式。...分别为: 函数重载和运算符重载,运算符重载后续讨论,这里讨论函数重载。英文是overload,和c++基本类似。 重载有一点是特别注意:不能通过返回值来重载,只能通过函数参数进行重载。...记得在侯捷视频,大师提到过,函数名是一样,但是编译器其实已经做了标记,在底层函数名称是不一样。 函数重载和c++类似,这里不细谈了。总之一点就通过函数参数来重载。...c++也有抽象,只要定义了函数都成为抽象函数:virtual void area() = 0; //定义函数,用来某形状计算面积而且不能实例化,只能被继承后,由派生来实例化...重载在同一个作用域(一般指一个)两个或多个方法函数相同,参数列表不同方法叫做重载,它们有三个特点(俗称两必须一可以): a.方法名必须相同 b.参数列表必须不相同 c.返回值类型可以不相同

79520

C++ OOP面向对象

Q: 面向对象特点 A: 封装,继承,多态 Q: 抽象 A: 抽象是特殊,只是不能被实例化(将定义了函数称为抽象);除此以外,具有其他特性;抽象方法只能声明于抽象,且不包含任何实现...另外,抽象可以派生自一个抽象,可以覆盖抽象方法也可以不覆盖,如果不覆盖,则其派生必须覆盖它们。虽然不能定义抽象实例,但是可以定义它指针,这正是用抽象实现接口重点所在。...Q: 函数 A: C++实现运行多态性是通过函数实现,而函数必须存在于继承环境下。 函数是重载一种表现形式,是一种动态重载方式。...因为函数作用是允许在派生函数重新定义。所以函数只能用于继承层次结构。...,由该所派生所有派生析构函数都自动成为函数,即使派生析构函数析构函数名字不相同

86410

C++重要知识点小结---2

这种类成为抽象。 一个抽象至少具有一个函数。所谓函数是指被标明为不具体实现成员函数。...: virtual void WithDrawal(float amount) = 0; //函数 在WithDrawal()声明之后“=0”表明程序员将不定义该函数。...如果在没有保留位置,则就没有重载。 函数是一个没有定义函数语句函数函数值是0.派生必须为每一个函数提供一个相应函数定义。...构造函数按下列顺序被调用: 任何虚拟构造函数按照它们继承顺序构造; 任何非虚拟构造函数按照它们继承顺序构造; 任何成员对象构造函数按照它们声明顺序调用; 自己构造函数。...函数 C++函数用于表示一个不能被创建实例, 必需是子类覆盖该方法定义后,方可新建实例,格式是在函数后面添加 = 0。

68570

C++基础(七).多态(1)

C++ 函数&函数&抽象&接口&》 《C++抽象函数》 ---- 概要 ---- 多态 在面向对象语言中,接口多种不同实现方式即为多态 多态特性,可以将子类类型指针赋值给父类型指针...在派生定义函数应与函数具有相同形参个数和形参类型(覆盖),以实现统一接口,不同定义过程。...一般来说,接口只有函数 4)带函数叫抽象,这种不能直接生成对象,而只有被继承,并且重写其函数后,才能使用 ---- 抽象 带有函数称为抽象 抽象是一种特殊,它是为了抽象和设计目的而建立...抽象是不能定义对象,在实际为了强调一个是抽象,可将该类构造函数说明为保护访问控制权限 抽象主要作用是将有关组织在一个继承层次结构,由它来为它们提供一个公共根,相关子类是从这个根派生出来...一个继承于抽象子类,只有实现了父所有的抽象方法才能够是非抽象 ---- 接口 接口只是一个概念,它在C++中用抽象来实现 接口是专门被继承,接口存在意义也是被继承,和C++抽象函数相同

46820

C++重要知识点小结---2

这种类成为抽象。 一个抽象至少具有一个函数。所谓函数是指被标明为不具体实现成员函数。...: virtual void WithDrawal(float amount) = 0; //函数 在WithDrawal()声明之后“=0”表明程序员将不定义该函数。...如果在没有保留位置,则就没有重载。 函数是一个没有定义函数语句函数函数值是0.派生必须为每一个函数提供一个相应函数定义。...构造函数按下列顺序被调用: 任何虚拟构造函数按照它们继承顺序构造; 任何非虚拟构造函数按照它们继承顺序构造; 任何成员对象构造函数按照它们声明顺序调用; 自己构造函数。...函数 C++函数用于表示一个不能被创建实例, 必需是子类覆盖该方法定义后,方可新建实例,格式是在函数后面添加 = 0。

79570

C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态使用)

重载声明是指一个与之前已经在该作用域内声明过函数或方法具有相同名称声明,但是它们参数列表和定义(实现)不相同。        ...Qt源码运用了大量函数重载,不仅在 C++,在其他语言Java等也有, 因为需要不同,所以有重载各种各样函数。 下面做个示例程序,说明函数重载使用方法。         ...函数:若在定义函数,以便在派生重新定义该函数更好地适用于对象,但是您在又不能对函数给出有意义实现,这个时候就会用到函数。...speak()方法前加了virtual关键字,变成了函数函数C++实现多态机制,核心就是通过访问派生定义函数;         上面的实例是 Animal 声明了一个指针 animal...然后通过指针来访问 Dog 对象与 People 对象 speak()方法,前提是 speak()方法必须声明为函数,且和派生定义方法名要相同,否则,指针将访问到自己

53810

三大特性之多态

返回值类型,函数名称,参数列表相同),那么就称该子类函数重写了父函数。...函数重写也可以被称为函数覆盖,因为带有函数都有一个函数表,在继承时候子类会继承函数表,如果子类对某一个函数进行重写了,那么该函数在子类函数表中就会被重写函数覆盖。...),重定义(隐藏) 重载 1.要在同一个作用域中 2.函数相同,参数列表相同,返回值可以不同 重写(覆盖) 1.两个函数分别在父和子类作用域中 2.返回值相同(协变除外),函数相同,...参数列表相同 3.只有函数才构成重写 重定义(隐藏) 1.两个函数分别在父和子类作用域中 2.函数相同只要不构成重写就是重定义 抽象函数对应还有一个函数,只要在函数声明最后加上...函数继承是一种接口继承,子类继承函数接口,目的是为了重写,达成多态,继承是接口。所以如果不实现多态,不要把函数定义成函数

16420

函数

,   可以在派生函数重新定义(形式也是:virtual 函数返回值类型 函数名(形参表){ 函数体 }),在派生重新定义函数应与函数具有相同形参个数和形参类型。...以实现统一接口,不同定义过程。如果在派生没有对函数重新定义,则它继承函数。...在这个表,主是要一个函数地址表,这张表解决了继承覆盖问题,保证其容真实反应实际函数。这样,在有函数实例(注:抽象即有函数不能被实例化。)...下面,分别说明“无覆盖”和“有覆盖”时子类函数样子。没有覆盖函数是毫无意义之所以要讲述没有覆盖情况,主要目的是为了给一个对比。...为了让大家看到被继承过后效果,在这个设计覆盖了父一个函数:f()。

74031

C++函数 virtual =0

=======================================================================  C++函数C++一种函数申明被称之为:函数...派生有自己VTABLE,但是派生VTABLE与VTABLE有相同函数排列顺序,同名函数被放在两个数组相同位置上。...a) {     (a->vptr[1])(); }     因为派生foo()函数具有相同VTABLE索引,而他们vptr又指向不同VTABLE,因此通过这样方法可以在运行时刻决定调用哪个...但是随着各类C++书越来越多,后来程序员也许不会再犯犯过错误了。但是打算澄清一下: override是指派生重写函数,就象我们前面B重写了Afoo()函数。...一个函数声明为后,函数意思是:是一个抽象

1.5K40

C++继承和多态高频面试题整理

之前几篇文章我们学习了C++多态和继承,这篇文章给大家整理一下继承和多态相关常考题目,供大家学习。 1....以下关于函数说法,正确是( ) A:声明函数不能实例化对象 B:声明函数 C:子类必须实现函数 D:函数必须是空函数 答案:A 关于函数描述正确是...( ) A:派生函数函数具有不同参数个数和类型 B:内联函数不能是函数(可以认为语法上可以) C:派生必须重新定义函数 D:函数可以是一个static型函数 答案...答案:D 假设A中有函数,B继承自A,B重写A函数,也没有定义任何函数,则( ) A:A对象前4个字节存储表地址,B对象前4个字节不是表地址 B:A对象和B对象前4个字节存储都是地址...C:A对象和B对象前4个字节存储表地址相同 D:A和B函数个数相同,但A和B使用不是同一张表 答案:D 2.

17410

C++】多态

前言 在之前讲过OOP(面向对象编程)三大核心思想之一———多态性(polymorphism)。我们把具有继承关系多个类型称为多态类型,因为我们能使用这些类型“多种形式”而无需在意他们差别。...在C++必须将他两种成员函数区分开来: 1.希望其派生类经行覆盖函数; 2.希望子类直接继承而不修改函数。...函数重写(覆盖):派生中有一个跟完全相同函数(即派生函数函数 返回值类型、函数名字、参数列表完全相同),称子类函数重写了函数。...b对象和派生d对象表是不一样,这里我们发现Func1完成了重写,所以d是重写Derive::Func1,所以函数重写也叫作覆盖覆盖就是指函数 覆盖。...总结一下派生表生成:a.先将表内容拷贝一份到派生 b.如果派生 重写了某个函数,用派生自己函数覆盖函数 c.派生自己 新增加函数按其在派生声明次序增加到派生最后

11810

c++继承面试点25连问

运行时多态简单来讲就是:使用指针或者引用指向一个派生对象,在非虚继承情况下,派生直接继承表指针,然后使用派生函数覆盖函数,这样派生对象通过表指针访问到函数就是派生函数了...成员函数重载、覆盖和隐藏区别 重载即为函数重载,重载特征: 相同范围,也就是在同一个函数名字相同函数参数不同; virtual关键字无影响。...覆盖是指派生函数覆盖函数覆盖特征: 不同范围,即函数分别位于派生函数名字相同函数参数相同函数必须有virtual关键字。...,但是函数没有virtual关键字,此时,函数将被隐藏; 总结:函数相同,参数也相同情况下,如果函数有virtual关键字,则是多态,否则就是隐藏;函数相同,参数不同情况下,如果函数位于同一个...同样,这段代码里面的CPeople就是抽象了,某个不论是自己定义了函数,还是从其他继承函数但却并没有实现,都可以称为抽象,所谓抽象,其实就是具体反义词,比方说这里只给了一个接口

90610

C++】一文简练总结【多态】及其底层原理&具体应用(21)

一个含有函数中都至少都有一个函数表指针,因为函数地址要被放到函数函数表也简称表 2)函数重写(覆盖函数重写(覆盖): 派生中有一个跟完全相同函数 (即派生函数函数返回值类型...、函数名字、参数列表完全相同) ,称子类函数 重写 了函数。...虽然函数名不相同【~Person() 】 【~Student() 】,看起来违背了重写规则,其实不然,这里可以理解为编译器对析构函数名称做了特殊处理,编译后析构函数名称统一处理成 destructor...函数规范了派生必须重写,另外函数更体现出了接口继承。...函数继承是一种 接口继承 ,派生继承函数接口, 目的是为了重写,达成多态 ,继承是接口。所以如果不实现多态,不要把函数定义成函数

10810

C++高阶】掌握C++多态:探索代码动态之美

cout << "买票-全价" << endl; } }; 函数重写(覆盖) 概念: 派生中有一个跟完全相同函数(即 派生函数函数返回值类型、函数名字、参数列表完全相同)...派生继承后也不能实例化出对象,只有重写函数,派生才能实例化出对象 接口继承和实现继承 普通函数继承是一种实现继承,派生继承函数,可以使用函数继承函数实现。...是重写Derive::Func1,所以函数重写也叫作覆盖覆盖就是指函数 覆盖。...先将表内容拷贝一份到派生 2. 然后如果派生重写了某个函数,用派生自己函数覆盖函数 3....,但是最后发现它们所调用函数地址相同,所以他们调用是同一个函数

20120

C语言与C++面试知识总结

shape1 = NULL; return 0; } 函数 函数是一种特殊函数,在不能对函数给出有意义实现,而把它声明为函数,它实现留给该派生去做。...带函数叫抽象,这种类不能直接生成对象,而只有被继承,并重写其函数后,才能使用。抽象继承后,子类可以继续是抽象,也可以是普通继承,具体见下文继承。...函数表:在程序只读数据段(.rodata section,见:目标文件存储结构),存放函数指针,如果派生实现了某个函数,则在覆盖原本那个函数指针,在编译时根据声明创建。...继承函数 相同之处:都利用了指针(均占用存储空间)和表(均不占用存储空间) 不同之处: 继承 依旧存在继承,只占用存储空间 表存储相对直接继承偏移 函数...抽象:含有函数 接口:仅含有函数抽象 聚合:用户可以直接访问其成员,并且具有特殊初始化语法形式。

4.9K41

C++从入门到精通(第九篇) :多态

b对象和派生d对象表是不一样,这里我们发现Func1完成了重写,所以d是重 写Derive::Func1,所以函数重写也叫作覆盖覆盖就是指函数覆盖。...总结一下派生表生成:a.先将表内容拷贝一份到派生 b.如果派生重写了 某个函数,用派生自己函数覆盖函数 c.派生自己新增加函数按其在 派生声明次序增加到派生最后...重载:在同一作用域中,函数相同和参数不同构成重载 重写:在继承域中,对于函数函数名,参数和返回值相同(特例除外),构成重写 重定义:在继承域中,函数相同,不构成重载就构成重定义...对于函数会在对象成员变量中生成函数表指针,指向函数表中储 了该对象函数地址 对于派生继承函数表,如果派生重写了函数,则会对继承函数对应函数地址进行覆盖成派生对象函数...抽象更好表现了现实生活抽象事物,植物,人等本不具有实例名称。 ps 想和博主一样刷优质面试和算法题嘛,快来刷题面试神器牛客吧,期待与你在牛客相见

44030

C++:41---覆盖和隐藏

覆盖(重写) 概念: 函数,如果派生相同函数,则子类方法覆盖了父方法 隐藏 概念: 当子类定义出“成员变量、方法”与父重名时,父会被隐藏 重点:对于函数定义了一些列重载函数...,在派生只要有一个同名函数(即使参数列表不一致),这些重载函数全部会被隐藏 如果想调用父成员变量、方法,需要加上父名限定符 备注:除了覆盖继承而来函数之外,派生最好不要隐藏在名字...C++覆盖与隐藏一直是一个容易理解出错地方,接下来就详细讲解一下区别在何处 覆盖指的是子类覆盖函数(被覆盖),特征是: 1.分别位于子类和父 2.函数名字与参数都相同 3.父函数函数...(virtual) 隐藏指的是子类隐藏了父函数(还存在),具有以下特征: 子类函数与父名称相同,但是参数不同,父函数被隐藏 子类函数与父函数名称相同,参数也相同,但是父函数没有virtual...,但是参数不同  父函数被隐藏如果子类函数与父函数名称相同&&参数也相同&&但是父函数没有virtual  父函数被隐藏如果子类函数与父函数名称相同&&参数也相同&&但是父函数有virtual

42230
领券