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

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

该声明是为派生类而保留的位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类中为子类保留的一个位置,以便子类用自己的实在函数定义来重载之。...如果在基类中没有保留位置,则就没有重载。 纯虚函数是一个没有定义函数语句的基类虚函数,纯虚函数的值是0.派生类必须为每一个基类纯虚函数提供一个相应的函数定义。...2.派生类可以继承基类的所有公有和保护的数据成员和成员函数。 保护的访问权限对于派生类来说是公有的,而对于其它的对象来说是私有的。即使是派生类也不能访问基类的私有的数据成员和成员函数。...在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...也就是说子类把父类的私有变量也继承下来了,但是却无法访问,对于我这种菜鸟来说一下子没法转个弯来,后来看看资料焕然大悟,子类虽然无法直接访问父类的私有变量,但是子类继承的父类的函数却可以访问,不然的话如果只继承函数而不继承变量

72970

C++ 重载运算符 继承 多态 (超详细)

=demo2; //派生类对象可以初始化基类引用; Base *Bpo=&demo2;//派生类对象可以赋给指向基类对象的指针;//多态实现的方法 主要是派生类中一定包含基类中所有成员,在使用中,一定可以找到对应成员...声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员。...1.纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion()=0 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。...同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。 注意含有纯虚函数的类,不能直接声明对象!!!!!!!!

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

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

    该声明是为派生类而保留的位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类中为子类保留的一个位置,以便子类用自己的实在函数定义来重载之。...如果在基类中没有保留位置,则就没有重载。 纯虚函数是一个没有定义函数语句的基类虚函数,纯虚函数的值是0.派生类必须为每一个基类纯虚函数提供一个相应的函数定义。...2.派生类可以继承基类的所有公有和保护的数据成员和成员函数。 保护的访问权限对于派生类来说是公有的,而对于其它的对象来说是私有的。即使是派生类也不能访问基类的私有的数据成员和成员函数。...在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...也就是说子类把父类的私有变量也继承下来了,但是却无法访问,对于我这种菜鸟来说一下子没法转个弯来,后来看看资料焕然大悟,子类虽然无法直接访问父类的私有变量,但是子类继承的父类的函数却可以访问,不然的话如果只继承函数而不继承变量

    82670

    浅谈C++多态性

    假设没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用对应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。...并非非常理解这样的使用方法,从原理上来解释,因为B是子类指针,尽管被赋予了基类对象地址,可是ptr->foo()在调用的时候,因为地址偏移量固定,偏移量是子类对象的偏移量,于是即使在指向了一个基类对象的情况下...C++纯虚函数 一、定义 纯虚函数是在基类中声明的虚函数,它在基类中未定义,但要求不论什么派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion()=0 二、引入原因 1、为了方便使用多态特性,我们经常须要在基类中定义虚拟函数。...为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。

    39510

    【C++】自学终极笔记

    错误示例: void func(int); int func(int);//返回类型不同则无法实现重载 默认参数的函数: 有默认值的参数应该位于参数列表的右侧 默认参数应该从右向左设置: 默认参数的赋值应该从右边的参数开始...抽象类: 抽象类是包含纯虚函数的类。抽象类不能被实例化,它用于定义接口,由派生类提供具体实现。...public E{//公有继承:B继承A+E的成员函数和数据成员 //... } 继承后派生类能够访问父类的public、protected成员,不能访问private成员 而类外普通函数、对象能够访问父类的...public成员,不能访问private、protected成员 不管哪种继承方式,父类的私有成员都不可以访问 派生类的构造: 会依次调用父类的构造函数,析构与构造顺序相反。...这确保在使用基类指针指向派生类对象时,可以正确调用派生类的析构函数,避免内存泄漏。 纯虚函数: 纯虚函数本身在基类中没有具体的实现,而是在派生类中被强制要求实现。

    24110

    C++进阶:继承和多态

    _stuNum << endl; } 例如上面这串代码,注释掉的那部分 就是错的,因为基类的友元函数无法访问到派生类保护或者私有成员。...菱形继承问题发生在一个类通过多个路径继承同一个基类,从而导致重复继承基类的成员。 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在B和C的继承A时使用虚拟继承,即可解决问题。...它允许基类指针或引用调用派生类的重载方法。 本篇主要以动态多态为主。 多态的定义以及实现 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。...即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...重载、重写、隐藏对比: 抽象类 要讲什么是抽象类,我们先讲什么是纯虚函数。 纯虚函数:在虚函数的后面写上 =0 ,则这个函数为纯虚函数。 那什么是抽象类呢?

    9510

    C++多态原理揭秘

    抽象类不能被实例化,也就是不能创建对象但是可以定义指向抽象类的指针和引用,并通过派生类对象的地址来初始化它们。 派生类必须实现其基类中所有的纯虚函数,否则它仍然是抽象类,无法被实例化。...因为抽象类的纯虚函数只有函数名,没有实现体,所以无法被单独实例化。但是,抽象类可以被用作基类,在派生类中实现纯虚函数,从而实现不同的多态行为。 规范派生类的实现。...抽象类中定义的纯虚函数,是对派生类接口的规范。派生类必须实现这些纯虚函数,否则无法被实例化。这样可以避免派生类在实现中遗漏必要的函数或参数,从而保证代码的正确性。 封装类的实现细节。...派生类的虚表 派生类的虚表有两部分构成: 第一部分: 从基类中继承下来的虚函数(如果在派生类中也定义了,就会重写,也就实现了多态). 第二部分: 派生类自己的虚函数,放在虚函数表的下半部分....派生类自己的虚函数,存放在第一个基类的虚表后面, 对于菱形虚拟继承,菱形继承都不推荐设计,就别谈菱形虚拟继承了,这里也就不讨论了. c++中有关多态的知识,到这里就结尾了,如果文章有什么错误之处,希望与牛牛私信交流

    15520

    【C++】看不懂多态?这篇文章带你吃透它!

    除此之外,纯虚函数是可以有函数体的,但是由于无法实例出对象,以及它一般会被派生类重写该纯虚函数,并且纯虚函数是用来表达一些比较抽象的事物比如植物、动物等,所以一般基类的纯虚函数的实现内容是没必要给的,因为没什么意义...总结: 抽象类不允许实例化出对象,但 不代表不能被其派生类调用派生类可访问的纯虚函数以及成员。 动态开辟的抽象类也是不允许的! 纯虚函数保持了多态的特性,通过父类的指针或者引用完成多态行为。...对于抽象类,当我们定义派生类对象的时候,也会去调用抽象类的构造函数。 若子类没有重写纯虚函数,则子类也无法实例化出对象。...​ 从图中可以观察到菱形虚拟继承的对象模型是比较复杂的,所以在平时的设计中,非常不建议设计为菱形继承,尽量避开!...答:不能,因为 静态成员函数没有 this 指针,使用 类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

    7010

    再探虚函数

    2、纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 3、声明了纯虚函数的类是一个抽象类。...所以,用户不能创建类的实例,只能创建它的派生类的实例,它必须在继承类中重新声明函数。 4、定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。...如果说,抽象类无法实例化对象,那就无法使用对象方法了嘛。...只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr

    87620

    virtual

    简单说明: 纯虚函数就像是java 中的接口函数,不能直接实例化,必须被派生类继承,然后对基类中的虚函数进行实现。...这也很自然的解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看书程序在调用的是哪个函数。...覆盖的函数前必须加关键字virtual,重载和virtual没有任何关系。 关于C++的隐藏规则 如果派生类的函数与基类的函数同名,但是参数不同。...此时,无论有无virtual关键字,积累的函数将被隐藏(注意别与重载混淆)。 如果派生类的函数与积累的函数同名,并且参数也相同,但是基类函数没有virtual关键字。...但是,它本身并不能通过虚拟机制被调用,这就是纯虚拟函数(pure virtual function)。

    66551

    栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    : 就是java中的抽象,纯虚函数只有声明没有具体实现就是空方法,在子类中必须重新写,虚函数就是在积累中写了有实现。...虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。...=[01101001],从右边数起,第0、3、5、6位是1,所以就表示了0、3、5、6这4个数,b的话同理,对应的是0、2、4、6这4个数。...,虚函数,友原函数,内联函数 1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。...包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

    5400

    领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字

    文章目录 前言 一、面向对象 二、使用类 1.类的基础使用 2.运算符重载 3.友元 1.友元函数 2.友元类 3.友元成员函数 三、类继承 基类 派生类 插个访问权限的事情 2.多态 ***公有 **...(继承了基类的实现) 派生类还继承了基类的接口 当然派生类和其他类的使用方法大致一样:可以有自己的构造函数,可以添加额外的数据成员和成员函数 插个访问权限的事情 首先派生类不能直接访问基类的私有成员,...这样就可以将基类与派生类的同名方法区分开,实现多态。 3.抽象基类 不能实例化的基类被称为抽象基类, 这样的基类只有一个用途, 那就是从它派生出其他类。...抽象基类提供了一种非常好的机制,让您能够声明所有派生类都必须实现的函数。如果 Trout 类从Fish 类派生而来,但没有实现 Trout::Swim( ),将无法通过编译。...② 类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来。 ③ 必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。

    53220

    1小时精通c++面向对象编程

    图5-5 静态联编 从示例可以看出,通过对象指针进行的普通成员函数的调用,仅仅与指针的类型有关,而与此刻指针正指向什么对象无关。...动态联编的优点是灵活性强,但效率低 实现动态联编需要同时满足以下三个条件: 1必须把动态联编的行为定义为类的虚函数 2类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来 3必须先使用基类指针指向子类型的对象...图5-7 虚函数与动态联编 解释一下上面的程序,B从A公有继承,B是A的子类型,B中的act1()为虚函数,b.act2()调用A中的act2(),进一步调用act1(),产生动态束定,运行时选择B::...图5-9 纯虚函数 5.6 抽象类 带有纯虚函数的类称为抽象类 抽象类只能作为基类使用,其纯虚函数的实现由派生类给出;但派生类仍可不给出纯虚函数的定义,继续作为抽象类存在 抽象类不能定义对象,一般将该类的构造函数说明为保护的访问控制权限...,其完整的实现由派生类完成 2用作指针或引用的基类型:保证进入继承层次的每个类都具有(提供)纯虚函数所要求的行为 ?

    85430

    基类派生类多态虚函数?

    成员函数与继承派生类可以继承其基类的成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己的新定义以覆盖从基类继承而来的旧定义。...派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。 和其他使用基类的代码一样,派生类能访问公有成员,而不能访问私有成员。...现在,我们只需知道访问说明符的作用是控制派生类从基类继承而来的成员是否对派生类的用户可见。 如果一个派生是公有的,则基类的公有成员也是派生类接口的组成部分。...多态: 多态:静态多态,动态多态 静态多态:函数重载,运算符重载,复用函数名 动态多态:派生类和虚函数实现运行时多态 区别: 静态多态的函数地址 早绑定-》编译阶段确定函数地址 动态多态的函数地址...1.虚析构与纯虚析构共性: 解决父类指针释放子类对象不干净问题 都需要有具体的函数实现 2.区别: 如果是纯虚析构,该类属于抽象类,无法实例化 .虚析构语法: virtual ~类名(){}

    19520

    C++进阶-多态

    协变 类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变(基类与派生类虚函数返回值类型不同) 示例: class A {}; class B : public...,只有重写纯虚函数,派生类才能实例化出对象 纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承 示例: class Car { public: virtual void Drive...,访问基类成员有一定得性能损耗 大概结果:示例: B继承A C继承A D继承B,C 五、继承和多态常见的面试问题 什么是多态?...不能,因为静态成员函数没有this指针,不能通过对象指针找到其虚函数表,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表 构造函数可以是虚函数吗?...可以,并且最好把基类的析构函数定义成虚函数 当基类指针指向new出来的基类对象或new出来的派生类对象时,需要使用指针进行释放对象,此时需要析构函数为虚函数,保证指针指向的对象成功释放 对象访问普通函数快还是虚函数更快

    60730

    【C++】三大特性之多态

    那么在继承中要 构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 2.虚函数 我们在讲继承的菱形继承的时候曾经说到过虚拟继承...包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象 。派生类继承后也不能实例化出对象, 只有重写纯虚函数,派生 类才能实例化出对象 。...纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。 2.接口继承和实现继承 普通函数的继承是一种 实现继承 ,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。...菱形继承、菱形虚拟继承 实际中我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样的 模型,访问基类成员有一定得性能损耗。...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3. 构造函数可以是虚函数吗?

    78250

    【C++】多态——实现、重写、抽象类、多态原理

    包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。...纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。...3.菱形继承、菱形虚拟继承 实际中我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样的模型,访问基类成员有一定得性能损耗。...不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3.构造函数可以是虚函数吗?...不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的 4.对象访问普通函数快还是虚函数更快? 对于普通对象,是一样快的。

    56131

    【C++进阶篇】C++继承进阶:深入理解继承的复杂性

    反之,如果友元函数在派生类中定义,它也无法访问基类的私有和保护成员。..._a;//error:对“_a”的访问不明确 return 0; } 编译器报出错误:对“_a”的访问不明确,编译器无法确定_a是从B还是C中继承过来的,这种二义性问题在实际开发中会带来严重的维护和理解困难...例如,如果派生类 D 同时继承自 B 和 C,而 B 和 C 都继承自 A,那么在访问 A 的成员时,编译器无法判断应该访问哪个副本。 虚拟继承: 虚拟继承消除了二义性问题。...9.2.3 多态性 继承为多态提供了基础,尤其是当基类指针或引用指向派生类对象时,能够实现运行时动态绑定,从而根据对象的真实类型调用适当的方法。...9.4 继承的常见问题与反思 9.4.1 二义性问题 在多重继承中,派生类如果继承了多个父类并且父类有相同成员(方法或属性),编译器就无法判断应该调用哪个父类的成员。

    8710

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

    为了方便使用,人们想出用一个调用形式,调用基类和派生类的同名函数,通过指针分别调用这些同名的函数。允许在派生类中重新定义和基类同名的函数,并可以通过基类指针或引用来访问积累和派生类中的同名函数。...所以如果不实现多态,不要把函数定义成虚函数4.虚析构和纯虚析构4.1概念 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构...虚析构和纯虚析构共性: 可以解决父类指针释放子类对象都需要有具体的函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法: virtual~类名(){} 纯虚析构语法...很简单把父类的析构函数改为虚析构或者纯虚析构即可4.2.1虚析构4.2.2纯虚析构为什么会出现这种情况,有无法解析的外部命令呢?...当子类重写父类的虚函数,子类中的虚函数表内部会替换成子类虚函数地址当父类的指针或引用指向子类对象时,发生多态通过观察测试我们发现b对象是8bytes,除了_b成员,还多一个__vfptr放在对象的前面(

    10910

    【C++】多态

    如果一个虚函数在接口后面加上=0,则这个虚函数为纯虚函数,纯虚函数所在的类为抽象类,抽象类是不可以被实例化出对象的,如果抽象类被继承,派生类里面天然的就会有纯虚函数,那么派生类也就变成了抽象类,一个类如果连对象都实例化不出来...//抽象类从某种程度上说,就是强迫子类重写纯虚函数。 //override是检查虚函数是否重写,抽象类是强迫派生类重写纯虚函数,否则派生类无法实例化出对象。...下面这道题的输出结果是"class A", “class B”, “class C”, “class D”,首先这是一个菱形虚拟继承,那么A类的成员变量在D成员中只会出现一份,因为菱形虚拟继承可以解决数据冗余和二义性的问题...从内存角度和语法角度来看,菱形继承分别带来了数据冗余和二义性的问题,虚拟继承能够解决菱形继承的原理即通过虚基表的方式进行解决,内存中只存一份虚基类成员,腰部派生类访问时通过自身成员模型中的虚基表来进行访问...纯虚函数所在的类称之为抽象类,抽象类会强制其派生类重写纯虚函数,因为如果不重写纯虚函数,派生类也无法实例化出对象,那就失去了其存在的意义。

    55220
    领券