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

派生类对基类中虚函数和非虚函数的继承效果

而虚函数的作用,主要是为了让父类指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。...子类可以重写父类的虚函数实现子类的特殊化。 2、纯虚函数:   C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++中的纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。   普通函数是父类为子类提供的“强制实现”。   ...因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。 参考链接

9210

从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类的构造函数需要给基类的构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象的构造次序: 先调用基类对象成员的构造函数,接着是基类的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...四、派生类到基类的转换 当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为基类对象指针 派生类对象引用自动转化为基类对象引用

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

    C++虚拟继承与虚基类

    多重继承使得派生类与基类的关系变得更为复杂,其中一个容易出现问题是某个基类沿着不同的路径被派生类继承(即形成所谓“菱形继承”),从而导致一个派生类对象中存在同一个基类对象的多个拷贝。...image.png 多重继承带来同一个基类对象在派生类对象中存在多个拷贝的问题,考察如下代码。...2.如何在派生类中只保留一份基类的拷贝 从逻辑上说,一个在职研究生只可能有一个名字和一个身份证号码,所以在一个EGStudent类对象中有IDPerson和Name字段的两个拷贝是不合理的,只需要一个拷贝就可以了...(4)虚拟继承中,虚基类对象是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的,派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用;如果未列出,则表示使用该虚基类的缺省构造函数。...因为虚拟继承只是表名某个基类的对象在派生类对象中只被构造一次,而在本例中类Student和Employee对象在EGStudent对象中本来就不会被构造多次,所以不将它们申明虚基类也是完全可以的。

    91020

    C++多态

    如果派生类有自己的虚函数,那么虚表中就会添加该项。派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。...虚函数的作用主要是实现了多态的机制,基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法为虚方法,否则将会形成覆盖。...如果派生类重写了基类的虚方法,该派生类虚函数表将保存重写的虚函数的地址,而不是基类的虚函数地址。...如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法,而且派生类中虚函数表将保存基类中未被重写的虚函数的地址。...注意,如果派生类中定义了新的虚方法,则该虚函数的地址也将被添加到派生类虚函数表中,虚函数无论多少个都只需要在对象中添加一个虚函数表的地址。

    1.9K10

    解锁C++继承的奥秘:从基础到精妙实践(上)

    在这篇文章中,我们将深入探讨C++继承的基础概念,包括基类与派生类的关系、多重继承的处理、虚函数与多态的应用,以及如何在复杂系统中有效利用继承来构建可维护且扩展性强的代码架构。...这意味着通过基类指针或引用访问派生类对象时,无法直接访问派生类中特有的成员函数或属性。 如果基类中的方法使用了虚函数(virtual),则在运行时会调用派生类中的重写方法(即多态)。...3.2 名称隐藏(Name Hiding) C++ 中的派生类可以定义与基类成员同名的成员,这种情况下,派生类的成员会隐藏基类的同名成员。...重要注意点: 要访问被隐藏的基类成员,可以使用作用域解析运算符(::),如Base::x或Base::show()。...在这种情况下,调用派生类对象时,即使是通过基类的指针或引用,也会调用派生类中覆盖的函数。

    17110

    【C++篇】虚境探微:多态的流动诗篇,解锁动态的艺术密码

    覆盖虚函数:如果派生类重写了基类的虚函数,则派生类的虚表中会用派生类的函数覆盖基类的函数。 派生类新函数:派生类新增的虚函数会被添加到虚表的末尾。...3.1.1 虚表的结构 在单继承的情况下,虚表的构造过程可以分为以下几个步骤: 继承基类虚表:当派生类继承了基类,并且基类中含有虚函数时,派生类会自动继承基类的虚表。...派生类可以通过这个虚表调用基类中的虚函数。 重写虚函数:如果派生类重写了基类的虚函数,则派生类的虚表中相应的函数指针将会被覆盖为派生类的函数实现,重写的虚函数替换基类的虚函数。...添加新虚函数:派生类定义的新虚函数会被添加到派生类的虚表末尾。...(Derived 重写了 Base2 的虚函数 func2) 多继承的情况下,派生类会为每个基类生成单独的虚表,当调用派生类的虚函数时,会根据调用的基类函数选择相应的虚表。

    13910

    C++基础-多态

    这种情况使用了多态机制 使用基类指针或引用指向基类或派生类对象,运行时调用对象所属的类(具有继承层次关系的基类或派生类)中的方法,这就是多态。...如果不将析构函数声明为虚函数,那么如果一个函数的形参是基类指针,实参是指向堆内存的派生类指针时,函数返回时作为实参的派生类指针将被当作基类指针进行析构,这会导致资源释放不完全和内存泄漏;要避免这一问题,...在这种情况下,编译器将为实现了虚函数的基类和覆盖了虚函数的派生类分别创建一个虚函数表(Virtual Function Table, VFT)。...基类中的虚函数,基类中要给出实现,派生类可实现也可不实现,即派生类需要覆盖基类中的虚函数 基类中的普通函数,基类中要给出实现,派生类可实现也可不实现。...• 派生类中被声明为 override 的函数是否是基类中对应虚函数的覆盖?确保没有有手误写错。 编程实践:在派生类中声明要覆盖基类函数的函数时,务必使用关键字 override 7.

    87220

    类继承

    派生类与基类之间的关系: 派生类对象可以使用基类(公有的)方法。 基类指针可以在不进行显示类型转换的情况下指向派生类对象,但只能调用基类方法。...实现多态公有继承的方法: 在派生类中重新定义基类的方法。 使用虚方法(虚函数)。 3. 静态联编和动态联编 函数名联编:编译器将源代码中的函数调用解释为执行特定的函数代码称为函数名联编。...虚函数表存储了为类对象进行声明的虚函数的地址。通常情况下,基类对象包含一个指向该类中虚函数表的指针。...,则该函数的地址也会添加到虚函数表中。...如果基类中重载函数被重新定义了,则应在派生类中重新定义所有的基类版本。如果只重新定义一个版本,则另外几个重载版本将被隐藏,派生类无法使用他们。 4.

    70420

    C++:29 --- C++继承关系下的内存布局(下)

    在单继承类层次下,每一个新的派生类都简单地把自己的成员变量添加到基类的成员变量之后 。 看看上图,C对象指针和D对象指针指向同一地址。 2.多重继承 大多数情况下,其实单继承就足够了。...回忆一下,在单继承和多重继承的情况下,内嵌的基类实例地址比起派生类实例地址来,要么地址相同(单继承,以及多重继承的最靠左基类) ,要么地址相差一个固定偏移量(多重继承的非最靠左基类) 。...当使用指针访问虚基类成员变量时,由于指针可以是指向派生类实例的基类指针,所以,编译器不能根据声明的指针类型计算偏移,而必须找到另一种间接的方法,从派生类指针计算虚基类的位置。...该变量指向一个全类共享的偏移量表,表中项目记录了对于该类 而言,“虚基类表指针”与虚基类之间的偏移量。 其它的实现方式中,有一种是在派生类中使用指针成员变量。...先根据P和R在S中的偏移,调整this为P*,也就是S*,然后跳转到相应的虚函数处执行。 在微软VC++实现中,对于有虚函数的多重继承,只有当派生类虚函数覆盖了多个基类的虚函数时,才使用调整块。

    1.3K20

    多态调用规则

    C++ 中的多态调用规则 在 C++ 中,多态是面向对象编程的一个重要特性,它允许我们通过基类指针或引用来调用派生类中的方法。...本文将通过一个简单的示例来探讨多态的调用规则,以及如何在不同情况下影响函数的调用。...接下来,我们将讨论不同情况下的多态调用规则: 指针调用: A* a1 = new B(); a1->Test(); // 调用 B::Test 当我们使用基类指针 a1 指向派生类对象 B 时,调用 Test...这是因为 Test 方法是虚函数,允许动态绑定。 引用调用: B b; A& a = b; a.Test(); // 调用 B::Test 在这种情况下,我们使用基类引用 a 指向派生类对象 b。...注意事项 在使用虚函数时,确保在基类的析构函数中也声明为虚函数,以避免资源泄漏和未定义行为。此外,尽量避免在类的成员函数中使用 delete this,除非你非常清楚对象的生命周期管理。

    8610

    EasyC++84,私有继承(二)

    我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。 这个概念我们很好理解,但具体到实现上,我们如何在派生类的方法当中调用基类的公有或者保护方法呢?...现在我们知道了使用解析运算符可以访问基类的方法,但问题又来了,如果我们要访问的不再是基类的方法而是基类对象本身,那么我们应该怎么办呢?...访问基类的友元 方法和对象都好办,但友元怎么办呢?因为友元函数并不属于类,所以无法通过类名或者解析运算符搞定。针对这种情况,我们只能取巧,通过显式地对派生类进行类型转换实现。...引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。 那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢?...原因也简单,首先在不使用类型转换的情况下,os 的友元函数类型匹配, 将会发生递归。其次由于C++支持多继承,所以编译器将会无法确定转换成哪个基类的类型。

    38910

    C++ 一篇搞懂继承的常见特性

    派生类: 派生类是通过对基类进行修改和扩充得到的,在派生类中,可以扩充新的成员变量和成员函数。 派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public。...需要注意的是:在派生类的各个成员函数中,不能访问基类的 private 成员。...要在派生类中访问由基类定义的同名成员时,要使用作用域符号:: 下面看具体的例子: // 基类 class Father { public: int money; void func();...那么如何在派生类构造函数里初始化基类构造函数呢?...从上面的例子中我们也得知构造派生对象前,是先构造基类对象,那么在析构的时候依然依据“先构造,后初始化”的原则,所以派生类析构时,会先执行派生类析构函数,再执行基类析构函数。

    59930

    CA1052:静态容器类型应是 Static 或NotInheritable

    默认情况下,此规则仅查看外部可见的类型,但这是可配置的。 规则说明 规则 CA1052 假定仅包含不设计为继承的静态成员的类型,因为该类型不提供任何可在派生类型中重写的功能。...未计划继承的类型应该用 C# 中的 static 修饰符进行标记,以便禁止其作为基类型使用。 此外,应删除其默认构造函数。 在 Visual Basic 中,类应转换为模块。...对于抽象类或具有基类的类,不会触发此规则。 但是,对于支持空接口的类,则会触发此规则。 备注 在该规则的最新分析器实现中,还包含规则 CA1053 的功能。...何时禁止显示警告 在以下情况下,可以禁止显示冲突: 类型设计为继承。 缺少 static 修饰符,表明该类型可用作基类型。 此类型不能用作类型参数。 静态类型不能用作类型参数。...以下示例演示如何在 C# 中使用 static 修饰符来标记类型,以解决此规则的冲突: public static class StaticMembers { public static int

    51020

    《C#图解教程》读书笔记之四:类和继承

    一、万物之宗:Object   (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义。   (2)一个派生类只能有一个基类,叫做单继承。 ?...二、基类那点事儿   (1)如何在派生类中访问基类成员?使用base关键字,如base.Field1;   (2)如何屏蔽基类中某个方法或成员?在派生类定义的成员定义前使用new关键字; ?   ...(3)如何使用基类的引用?这里可以借鉴里氏替换法则,创建指向派生类的基类对象。 ? 三、小字符有大学问:成员访问修饰符 ?   ...(1)public:所有的类,包括程序集内部的和外部的类均可无限制地访问;   (2)private:只能被他自己的类的成员所访问;   (3)protected:允许自己类的成员和继承自该类的派生类的成员访问...四、密封类与静态类   (1)密封类:无法被继承,需要使用sealed修饰符;   (2)静态类:       ①类的所有成员必须是静态的;       ②类可以有一个静态构造函数,但不能有实例构造函数

    67140

    最全面的c++中类的构造函数高级使用方法及禁忌

    说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。 本篇文章讲解c++中,构造函数的高级用法以及特殊使用情况。 1....里面使用移动构造就要小心了,一不小心就会出现问题哦,具体移动构造怎么实现可以参考上面第一点中的代码。...什么情况下必须使用构造函数初始化列表而不能赋值 有这样一段代码: #include using namespace std; class CPtr { private:...怎么防止类对象被拷贝和赋值 防止类对象被拷贝和赋值,换句话说,就是不能调用类的拷贝函数和赋值运算符重载函数,我们首先能想到的就是把这两个函数声明为private的,或者私有继承一个基类,而到了c++11...综上,不论是基类还是继承类,他们的构造函数中都可以直接调用虚函数。

    1.8K30

    C++学习知识点

    OOP面向对象程序设计的多态的理解 答:多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。...: 主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,使用初始化列表少了一次调用成员的默认构造函数的过程...(3)尽量将基类的析构函数定义为虚函数,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。...C++中的接口就是类的成员虚函数。实现多态性,通过指向派生类的基类指针,访问派生类中同名重定义的成员虚函数。 9....(3) 显式执行重载的构造函数,初始化申明在栈上的类对象,直接申明,不要使用new,如GPR gpr= GPR(6),其中类GPR构造函数是GPR(int i){}; (4) new申明的是类指针,

    1.7K20

    《C++Primer》第十五章 面向对象程序设计

    一般情况下派生类中虚函数返回类型是类本身的指针或引用时,上述规则无效。比如D由B派生而来,则基类的虚函数可以返回B*而派生类的对应函数可以返回D*。...通常情况下只有成员函数(或者友元)中的代码才需要使用作用域运算符来回避虚函数的机制。...一如往常,名字查找先于类型检查 声明在内层作用域的函数并不会重载声明在外层作用域的函数。因此定义派生类中的函数也不会重载其基类的成员。...using声明语句指定一个名字而不指定形参列表,所以一条基类成员函数的using声明可以把该函数的所有重载实例添加到派生类作用域中。...在实际编程中,如果基类中没有默认、拷贝或移动构造函数,那么一般情况下派生类也不会定义相应的操作。 5.

    1.2K20

    《挑战30天C++入门极限》C++中类的多态与虚函数的使用

    C++中类的多态与虚函数的使用   类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的...); a.ShowMember(); Car b(180,110,4); b.ShowMember(); cin.get(); }   在c++中是允许派生类重载基类成员函数的...但是在实际工作中,很可能会碰到对象所属类不清的情况,下面我们来看一下派生类成员作为函数参数传递的例子,代码如下: //例程2 #include using namespace...对象a与b分辨是基类和派生类的对象,而函数test的形参却只是Vehicle类的引用,按照类继承的特点,系统把Car类对象看做是一个Vehicle类对象,因为Car类的覆盖范围包含Vehicle类,所以...virtual修饰,不单单对基类和派生类的普通成员函数有必要,而且对于基类和派生类的析构函数同样重要。

    70510
    领券