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

【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 ---- 1....虚函数解析 : 在对象调用虚函数方法时 , 系统会查看该对象真正类型是什么类型 , 然后去调用对应类型的方法 ; 对象是使用什么类型的构造函数创建的 , 其真正的类型就是这个类型 , 因此最终调用该类中的虚函数方法...虚函数使用要点 : 1. 构造方法 : 不能设置成虚函数, 如果将构造方法设置成虚函数 , 编译时会报错 ; 2....virtual_method 方法 , 该方法时虚函数 , 子类重写了该虚函数 , 在函数调用的时候 , 会自动根据对象的类型判定调用哪个方法 , 该对象使用 new Child() 创建 , 其类型是...Child 类型 , 因此最终调用的是子类重写的方法 ; 纯虚函数 ---- 1.

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

    C++之虚函数的作用和使用方法

    虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 请分析例12.2。这个例子开始时没有使用虚函数,然后再讨论使用虚函数的情况。...由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。 虚函数的使用方法是: 在基类用virtual声明成员函数为虚函数。...如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。...通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。 通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。...,这并不是多态性行为(使用的是不同类型的指针),没有用到虚函数的功能。

    1.4K80

    virtual

    虚函数的使用就是为了方便多态的使用,常常需要在基类中定义虚函数,然后对基类进行继承,再对基类中的虚函数进行重载。...virtual在函数中的使用限制 普通函数不能是虚函数,也就是说虚函数的定义必须在某个类中。虚函数不可以是一个全局函数,不可以单独在类外定义,否则会导致编译错误。...函数重载和虚函数的不同 重载的几个函数必须在同一个类中,覆盖的函数必须在有继承关系的不同类中 重载的函数必须函数名相同,参数列表不同。覆盖的几个函数必须函数名、参数、返回值都相同。...此时,基类的函数被隐藏(注意别与覆盖混淆)。 纯虚函数 C++语言为我们提供了一种语法结构,通过它可以指明,一个虚拟函数只是提供了一个可被子类型改写的接口。...通过虚函数表的偏移找到函数的入口地址,从而找到要使用的虚函数。

    66551

    C++ OOP面向对象

    Q: 面向对象特点 A: 封装,继承,多态 Q: 抽象类 A: 抽象类是特殊的类,只是不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现...Q: 虚函数 A: C++实现运行中的多态性是通过虚函数实现的,而虚函数必须存在于继承环境下。 虚函数是重载的一种表现形式,是一种动态的重载方式。...定义一个函数为纯虚函数,才表示函数未被实现 ,定义它是为了实现一个接口,起一个规范作用。继承抽象类的派生类要实现这个函数… Q: 接口 A: 有时候,我们得提供一些接口给别人使用。...接口的作用,就是提供一个与其他系统交互的方法。其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部的接口来与你进行通信。根据c++的特点,我们可以采用纯虚函数的方式来实现。...这样做的好处是能够实现封装和多提供给外面使用的接口一般采用纯虚函数。 实现接口是通过继承接口的子类来实现的,不同的子类可以实现不同效果,即所谓多态。

    89210

    C++基础-多态

    在编码时,我们将不同类型(具有继承层次关系的基类和派生类)的对象视为基类对象进行统一处理,不必关注各派生类的细节,在运行时,将会通过相应机制执行各对象所属的类中的方法。...(覆盖纯虚函数) d.func2(); // 访问派生类中的覆盖函数(覆盖纯虚函数) d.func3(); // 访问派生类中的覆盖函数(覆盖虚函数) d.func5...普通函数不支持多态,所以需要继承的函数应声明为虚函数,不应使用普通函数 5. 使用虚继承解决菱形问题 一个类继承多个父类,而这多个父类又继承一个更高层次的父类时,会引发菱形问题。...使用 final 禁止覆盖 被声明为 final 的类禁止继承,不能用作基类。而被声明为 final 的虚函数,不能在派生类中进行覆盖。...不可能实现虚复制构造函数,因为在基类方法声明中使用关键字 virtual 时,表示它将被派生类的实现覆盖,这种多态行为是在运行阶段实现的。

    87220

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

    ;可以用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数 多态是通过虚函数实现的 多态可以让父类的指针有“多种形态”,这是一种泛型技术(所谓泛型技术,就是试图使用不变的代码来实现可变的算法...在派生类中定义的函数应与虚函数具有相同的形参个数和形参类型(覆盖),以实现统一的接口,不同定义过程。...类里声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现...一般来说,接口类中只有纯虚函数的 4)带纯虚函数的类叫抽象类,这种基类不能直接生成对象,而只有被继承,并且重写其虚函数后,才能使用 ---- 抽象类 带有纯虚函数的类称为抽象类 抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的...一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。

    50120

    十一、多态

    特性: 接口性:多态是超类通过方法签名,向子类提供一个共同的接口。 延迟绑定(动态绑定):调用方法时,在运行时再决定调用哪个类的方法。 替换性:多态对已存在具有继承关系的类进行扩展。...多态问题的引入背景 在面向对象编程中,多态的引入主要是为了解决以下问题: 提高代码的复用性:通过继承,子类可以继承父类的属性和方法,而多态则允许子类重写父类的方法,从而实现特定于子类的行为。...Derived类不是抽象类,因为它实现了从Base类继承来的纯虚函数myFunction()。 使用场景 接口定义:抽象类用于定义一组派生类必须实现的接口。这有助于确保派生类遵循特定的行为模式。...模板方法模式:在模板方法模式中,抽象类定义了一个算法的骨架,将一些步骤延迟到子类中实现。纯虚函数用于定义这些必须由子类实现的步骤。...final关键字用于防止类被继承或防止虚函数在派生类中被覆盖,以提供更严格的类继承控制。

    10110

    C++多态原理揭秘

    纯虚函数的作用是规范继承类的接口,强制派生类提供相应的实现,从而增强程序的可扩展性。同时,纯虚函数也可以作为基类中的一个默认实现,提供一些默认的行为。 抽象类的作用如下: 提供一种适合多态的机制。...因为抽象类的纯虚函数只有函数名,没有实现体,所以无法被单独实例化。但是,抽象类可以被用作基类,在派生类中实现纯虚函数,从而实现不同的多态行为。 规范派生类的实现。...接口继承与实现继承 实现继承: 派生类继承了基类普通函数,可以使用函数,继承的是函数的实现。也就是实现继承....(继承下来) 如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 (重写) 派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后。...(新增) 原理: 多态是因为在派生类中,对继承下来的虚函数进行了重写. 当程序调用一个虚函数时,实际上是通过对象的vptr找到相应的虚函数表,再根据函数在虚函数表中的索引找到具体的函数地址。

    15520

    C++新旅程:三大特性之多态

    2.1虚函数存在的意义在类的继承层次结构中,在不同层次可以出现名字相同,参数个数和类型都相同的,功能不同的函数,编译系统按照同名覆盖原则决定调用对象。...为了方便使用,人们想出用一个调用形式,调用基类和派生类的同名函数,通过指针分别调用这些同名的函数。允许在派生类中重新定义和基类同名的函数,并可以通过基类指针或引用来访问积累和派生类中的同名函数。...注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用 虚函数重写的两个例外...概念在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类的重写方法因此可以将虚函数改为纯虚函数。...简单示例 3.2接口继承和实现继承 普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。

    10910

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

    ,因为矩形多了一个表示宽度的成员变量,所以使用基类的构造方法进行初始化后,再只用对宽度单独赋值就可以了 { w=x; } float Rectangle::getArea() //对getArea...,C++支持两种多态性:编译时多态性,运行时多态性(编译时多态性:通过重载函数实现 ;运行时多态性:通过虚函数实现) 虚函数 :在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖...(Override) 纯虚函数:纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后加“=0” 抽象类:包含纯虚函数的类称为抽象类。...如果子类没有实现纯虚函数,纯虚函数将继承给子类。那么这时子类同样也是一个抽象类 原文地址

    42710

    【C++】多态(定义、虚函数、重写、隐藏)

    继承中要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 如果是通过基类的指针调用虚函数,要如下图所示使用: 虚函数 虚函数...注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用 虚函数重写的两个例外...重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 概念 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象。...派生类继承后也不能实例化出对象,只有重写纯虚函数,派生 类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。 Benz没有重写纯虚函数,所以不能实例化对象。...结论:使用父类对象调用的方法永远是父类的方法 2.

    18010

    基类派生类多态虚函数?

    所以基类的成员函数反正都要被覆盖,从某种意义上来基类的成员函数可以用纯虚函数来代替。...我们用受保护的(protected)访问运算符说明这样的成员。 派生类必须通过使用类派生列表(clss erivatin list)明确指出它是从哪个(哪些)基类继承而来的。...此外,我们能将公有派生类型的对象绑定到基类的引用或指针上。 大多数类都只继承自一个类,这种形式的继承被称作“单继承”。 派生类中的虚函数派生类经常(但不总是)覆盖它继承的虚函数。...如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他的普通成员,派生类会直接继承其在基类中的版本,派生类可以在它覆盖的函数前使用virtual关键字,但不是非得这么做(可有可无)。...纯虚析构语法: virtual ~类名()=0; 类名::~类名(){} 纯虚数 子类的内容会覆盖父类,所以父类中函数没有意义了 类中只要有一个纯虚函数就称为抽象类 virtual void

    19520

    C++【多态】

    ,实现不同的方法,因此 多态 的实现依赖于 继承 同一个售票地点,为不同的购票方式提供了不同的取票窗口(多种状态 -> 多态) ---- ️正文 1、多态基本概念 在使用多态的代码中,不同对象完成同一件事会产生不同的结果...虚函数的作用是在目标函数(想要构成多态的函数)之间构成 重写(覆盖),一旦构成了 重写(覆盖),那么子类对象在实现此虚函数时,会 继承父类中的虚函数接口(返回值、函数名、参数列表),然后覆盖至子类对应的虚函数处...:子类虚函数继承父类虚函数的接口,进行重写,构成多态 建议:假如不是为了多态,那么最好不要使用 virtual 修饰函数,更不要尝试定义纯虚函数 注意: 若父类中为抽象类,那么子类在继承后,必须对其中的纯虚函数进行重写...,可以看到涉及虚函数类的对象中都有属性 __vfptr(虚表指针),可以通过虚表指针所指向的地址,找到对应的虚表 虚函数表中存储的是虚函数指针,可以在调用函数时根据不同的地址调用不同的方法 在下面这段代码中...;而动态绑定是虚函数的调用过程,需要 虚表指针+虚表,在程序运行时,根据不同的对象调用不同的函数 ---- 5、单继承与多继承中的虚表 5.1、单继承中的虚表 单继承中的虚表比较简单,无非就是 子类中的虚函数对父类中相应的虚函数进行覆盖

    14630

    C++三大特性之多态详解

    在继承中要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 举个栗子: 2.2 What is 虚函数?...派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象. 纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。...普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。...这种机制实现了方法的定义与具体的对象无关, 而对方法的调用则可以关联于具体的对象。 A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定 3. 面向对象设计中的继承和组合,下面说法错误的是?...以下关于纯虚函数的说法,正确的是(A ) A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类 C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数 5.

    15110

    深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性

    这里写目录标题 虚函数 虚函数实现动态绑定 虚继承 抽象类 虚函数 虚函数是在C++中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明,在基类中定义,可在派生类中进行重写。...这使得在继承关系中,通过基类指针或引用调用虚函数时,可以根据实际对象的类型来动态地确定要执行的函数版本,实现多态性的特性。...纯虚析构语法: virtual ~类名()=0; 类名::~类名(){} 纯虚数 子类的内容会覆盖父类,所以父类中函数没有意义了 类中只要有一个纯虚函数就称为抽象类 virtual void...虚继承通过使用virtual关键字修饰基类,在派生类对该基类进行继承时,确保只有一份共享的基类子对象被创建,从而解决了菱形继承问题。...Derived类继承自Base类,并提供了对纯虚函数的具体实现。通过Derived类的对象或基类指针可以调用纯虚函数的具体实现。 纯虚函数允许在基类中定义一组接口,并强制要求派生类提供相应的实现。

    2.1K10

    c++ 深入理解虚函数

    面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚绑定 虚函数表 ---- 什么是多态?...也就是说有一个计算面积的形状基类,圆形和矩形类派生自形状类,圆形与矩形的类各有自己的计算面积的方法。可见动态多态是以封装和继承为基础的。...,调用的时候可以找到该类的虚函数表指针,通过虚函数表指针找到虚函数表,通过虚函数表的偏移找到函数的入口地址,从而找到要使用的虚函数。        ...如果我们在子类中定义了从父类继承来的虚函数,对于父类来说情况是不变的,对于子类来说它的虚函数表与之前的虚函数表是一样的,但是此时子类定义了自己的(从父类那继承来的)相应函数,所以它的虚函数表当中管于这个函数的指针就会覆盖掉原有的指向父类函数的指针的值...;//子类调用从父类继承来的函数。 父类和子类出现同名虚函数称为覆盖 父类指针=new 子类名(...);父类指针->函数名(...);//调用子类的虚函数。

    1.7K60

    纯虚函数

    定义 纯虚函数就是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后面加“=0” 引入原因 方便的使用多态,因此常常在基类中定义虚函数 在很多情况下,基类本身生成对象是不合理的。...纯虚函数最显著的特征是:它们必须在继承类总重新声明函数(不要后面的=0,否则该派生类也不鞥实例化),而且它们在抽象类中往往没有定义。 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。...使用抽象类时注意: 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然是一个抽象类。...由多态方式调用的时候动态绑定。 实现了纯虚函数的子类,该纯虚函数在子类中就变成了了虚函数,子类的子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。 虚函数是C++中用于实现多态的机制。

    1.1K20

    【C++】C++多态世界:从基础到前沿

    那么在继承中要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 1....概念 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。...派生类继承后也不能实例化出派生类对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。 2....接口继承和实现继承 普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。...虚函数覆盖:派生类中重写的虚函数会覆盖派生类对象虚表中的基类继承的函数指针,未重写的基类的虚函数依次存储在该派生类对象的虚表中,这样派生类对象的虚表中就同时存在基类与派生类的函数指针,在用基类对象指针或引用调用的时候通过

    11510
    领券