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

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

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

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

    【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

    一、常量成员函数 1、const 修饰成员函数分析 在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 类中 , 定义了 void fun(int...在 * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 类的成员函数 // const 关键字可以 // 在 void...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数中 不能修改 类对象中的 任何成员变量 ; class Student { public: void fun..." << endl; } ~Student() { cout 的析构函数" << endl; } // 使用 const 修饰 类的成员函数 // const

    22920

    【C++】模板继承多态

    通过调用·基类相应的构造函数来初始化 派生类的构造函数和析构函数,负责初始化和清理派生类部分 派生类从基类继承来的成员的初始化和清理谁来负责?...是由基类的构造和析构来负责 派生类对象构造和析构的过程是: 派生类调用基类的构造函数,初始化从基类继承来的成员。 调用派生类自己的构造函数。...初始化派生类自己特有的成员 派生类对象的作用域到期了 1.调用派生类的析构函数,释放派生类成员可能占用的外部资源(堆内存,文件) 2.调用基类的析构函数,释放派生类内存中,从基类继承来的成员可能占用的外部资源...static静态成员方法 (错误) 虚析构函数 (可以) 析构函数调用时,对象是存在的 基类的虚函数是虚函数,派生类的析构函数自动变成虚函数 当基类指针(引用)指向堆上new出来的派生类对象的时候...在类的构造函数当中,调用虚函数,也是静态绑定(构造函数中调用其他 函数(虚)不会发生动态绑定) 如果不是通过指针或者引用变量来调用虚函数,那就是静态绑定。

    10510

    C++primer学习笔记(六)

    virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。根类一般要定义虚析构函数。 派生类只能通过派生类对象访问protected成员,不能用基类对象访问。...可以使用域操作符强制调用基类虚函数【虚中调虚】。基类虚函数和派生类的默认实参要一致。...派生类指针的静态类型和动态类型不一致时【基类指针指向派生类是时】,为保证删除指针调用合适的析构函数【多态】,基类析构必须为virtual。...表中可以有非类型形参,实例化时绑定值。 通过在成员前面加上typename告诉编译器将成员当做类型。...模板类中的static成员由同一实例化的对象共享,但不同模板形参的实例化对象间不共享。

    1.1K20

    必知必会之C++多态机制

    具体来说,多态性允许基类的指针或引用在运行时指向派生类的对象,并且根据对象的实际类型来调用相应的成员函数。 多态性是通过虚函数来实现的。...当一个基类的成员函数被声明为虚函数时,派生类可以通过覆盖(重写)这个函数来提供自己的实现。在运行时,调用这个虚函数的时候,实际上调用的是指向对象的实际类型的版本。...动态多态(运行时多态): 主要是通过虚函数和继承实现的,例如,基类指针指向派生类对象,并调用虚函数。在运行时,根据对象的实际类型来决定调用哪个版本的函数。这种多态性在运行时才会确定。...派生类重写虚函数: 派生类中可以通过重写(覆盖)基类中的虚函数来提供自己的实现。在调用这个虚函数时,会根据对象的实际类型来决定调用哪个版本的函数。...在 main() 函数中,我们创建了 Dog 和 Cat 类的对象,并将基类指针指向这些对象,然后通过基类指针调用虚函数 makeSound()。

    16710

    C++ 多态

    虚函数:在基类中声明为virtual的成员函数。当通过基类指针或引用调用虚函数时,如果指针或引用实际上指向的是派生类对象,那么将调用派生类中重写的虚函数版本。...这意味着当通过基类指针或引用来调用虚函数时,如果指针或引用实际上指向的是派生类对象,那么将调用派生类中重写的虚函数版本。 特点: 基类函数必须是虚函数(用virtual关键字声明)。...当通过派生类对象或派生类指针来访问这些被隐藏的成员时,将访问派生类中的版本,而不是基类中的版本。 特点: 隐藏可以发生在成员函数、成员变量以及类型定义(如嵌套类)上。...当派生类中的函数或成员变量与基类中的同名成员具有相同的名称时,基类中的成员将被隐藏。 隐藏不同于重写,因为隐藏不涉及虚函数和动态绑定。隐藏是静态的,即在编译时就已经确定访问的是哪个成员。...,基类的指针对派生类产生了切割,但是这个指针指向的是派生类的_vfptr指向的虚函数表,也就是派生类自己的,派生类通过自己的虚函数表找到覆写的虚函数执行 动态绑定与静态绑定 对不满足多态条件的函数

    5710

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    有时我们不希望派生类独有的部分被截断则需要使用类指针来调用重载的函数或使用指针所指的成员。...我们很多时候希望的是我们通过将基类指针指向派生类,然后可以动态调用派生类的函数,这时我们可以将基类的对应函数写为虚(virtual)函数来实现,此时发生的称为动态绑定 派生类可以继承多个基类,称为多继承...每次继承一个基类就会在内存中生成一个子对象,存放了基类的成员,也正是因为这个原因派生类可以转换为基类 派生类的构造函数需要负责所有成员的初始化,尽管派生类也可以初始化继承来的基类成员,但是这不符合通常的编码思路...,派生类一般在构造函数开始的地方调用基类的构造函数,让基类来初始化自己的成员 静态类型是变量本身代码中的类型,在编译时决定,动态类型是变量在内存中的对象的类型,在运行时才能决定。...,对于实现的内容我们一样可以使用=default简化 如果基类中的基本操作函数不可访问或被删除,则派生类中的对应成员是被删除的因为我们无法使用基类来操作那些成员 C11中,我们可以用using重用基类定义的构造函数

    1.7K10

    C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

    二.基类和派生类的转换 派生类的对象可以赋值给基类的指针或者引用(赋值兼容转换),可以通过切分来形容这个过程,编译器将派生类中属于基类的空间切分出来,使指针,或者引用指向基类空间的起始位置。...基类对象不能赋值给派生类对象 基类对象可以通过强制类型转焕赋值给派生类的指针或者引用,但基类的指针必须指向派生类对象时才是安全的,具体细节后续在介绍。...在派生类中显示调用基类的同名函数 四.派生类的默认成员函数 4.1默认成员函数的行为 默认成员函数的两个主要问题: 不写默认成员函数,编译器默认生成的行为是什么 默认生成的成员函数不符合需求,自己该如何实现...派生类的构造函数必须调用基类的构造函数初始化基类的那部分成员。...基类中不存在默认构造,派生类不会自动生成 先构造基类,然后构造派生类 拷贝构造 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化 想要显示调用基类的构造函数,就只能通过初始化列表完成

    10510

    读完某C++神作,我只记下了100句话

    根类一般要定义虚析构函数。 派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。...用做基类的类必须是已定义的。 存在虚函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。可以使用域操作符强制调用基类虚函数【虚中调虚】。基类虚函数和派生类的默认实参要一致。...派生类继承基类的访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类的用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...如果知道基类到派生类的转换【这种转换是基类地址赋给派生类指针】是安全的【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...派生类指针的静态类型和动态类型不一致时【基类指针指向派生类是时】,为保证删除指针调用合适的析构函数【多态】,基类析构必须为virtual。

    1.4K20

    【继承】—— 我与C++的不解之缘(十九)

    基类对象不能赋值给派生类对象 基类的指针/引用 可以通过强制转换赋值给派生类的指针和引用 ,但必须是基类的指针指向派生类对象时才是安全的。...);我们无法通过派生类对象直接访问基类的成员函数。...五、派生类的默认成员函数 1、默认成员函数 现在再来看一下默认成员函数: 所谓默认成员函数(6个),就是我们不写编译器会自动生成;那在派生类当中,这写默认成员函数是如何生成的呢。...派生类的构造函数必须调用基类的构造函数来初始化基类的那部分成员,如果基类没有默认构造函数,就必须在派生类构造函数的初始化列表显示调用。...派生类的析构函数会在被调用完成之后自动调用基类的析构函数清理基类成员;(这样才能保证派生类对象先清理派生类的那一部分成员,再清理基类成员这一顺序)。

    11510

    《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

    ,可以在派生类内完成以下几种功能: 可以增加新的数据成员和成员函数 可以对基类的成员进行重定义 可以改变基类成员在派生类中的访问属性 基类成员在派生类中的访问属性 派生类可以继承基类中除了构造函数与析构函数之外的成员...public、protected、private3中访问属性,基类的成员函数可以访问基类中其他成员,但是在类外通过基类的对象,就只能访问该基类的公有成员。...派生类对基类成员的访问形式主要有以下两种: 内部访问:由派生类中新增的成员函数对基类继承来的成员的访问。 对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。...建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用都被自动忽略。...可以声明指向抽象类的指针或引用,此指针可以指向它的派生类,进而实现多态性。 如果派生类中没有定义纯虚函数的实现,而派生类中只是继承基类的纯虚函数,则这个派生类仍然是一个抽象类。

    3.4K40

    后台开发:核心技术与应用实践 -- C++

    派生类构造函数必须对这3类成员进行初始化,其执行顺序是这样的: 先调用基类构造函数; 再调用子对象的构造函数; 最后调用派生类的构造函数体 当派生类有多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时声明的顺序...在派生时,派生类是不能继承基类的析构函数的,也需要通过派生类的析构函数去调用基类的析构函数。...在派生类中可以根据需要定义自己的析构函数,用来对派生类中所增加的成员进行清理工作;基类的清理工作仍然由基类的析构函数负责。...而 虚函数 的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。...虚函数的声明方式: virtual 返回类型 函数名(); 当把基类某个成员函数声明为虚函数后,就允许在其派生类中对该函数重新定义,赋予它新的功能,且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数

    1.3K10

    C++之继承

    (派生类对应基类,子类对应父类,在使用时尽量对应使用) 之前我们了解的代码复用,比如模板类,模板函数等都属于函数复用,而继承属于类设计层次的复用。...fun函数并不构成重载,因为他们在不同的作用域,他们是隐藏关系 四、派生类的默认成员函数 1.构造函数 派生类构造函数必须调用基类的构造函数初始化基类那一部分成员,如果基类没有默认构造函数,派生类就必须在初始化列表处显示的调用基类构造函数...派生类对象初始化时,会先调用基类构造函数,再调用派生类构造函数。 2.拷贝构造 必须调用基类的拷贝构造完成基类部分的拷贝构造。...4.析构函数 派生类额析构函数会在调用结束后自动调用基类的析构函数清理基类成员,确保先清理派生类的成员再清理基类的成员的析构顺序。 派生类对象析构先调用派生类析构函数再调用基类析构函数。...通过B和C中的两个指针分别指向的两张表,这两个指针叫做虚基表指针,这两张表叫做虚基表。虚基表中存放着A成员偏移量。(虚基表,实际上是一个数组)通过偏移量可以找到下面的A。

    42010

    C++ 继承

    可以 被 基类的指针 或 引用 派生类的指针或引用不可以指向基类 基类的指针或者引⽤可以通过强制类型转换赋值给派⽣类的指针或者引⽤。...先说结论:建议你都要写 而且把基类的部分要单独看成一个内置类型 都要调用基类的玩意 析构时派生先析构 构造是基类先构造 派生类的构造函数必须调用基类构造函数的那一部分成员...,所以不用再派生的析构里写基类的析构函数 派生类初始化会先调用基类构造再调用派生构造 派生对象析构清理会先调用派生后调用基类 因为多态中⼀些场景析构函数需要构成重写...编译器在面对这种情况时,无法确定应该访问哪一份基类的拷贝,从而导致编译错误或不确定的行为。虚继承通过共享基类数据成员的方式消除了这种二义性,使得在派生类中访问基类成员变得明确且唯一。...每个虚继承的子类都有一个虚基类指针,该指针指向一个虚基类表,虚表中记录了虚基类与本类的偏移地址。通过偏移地址,可以找到虚基类成员,从而实现了在多重派生子类中只保存一份共有基类的拷贝的功能。

    4610

    继承机制深度解析:从基础到进阶的完整指南

    模板类继承在泛型编程中非常有用,允许派生类在不同数据类型上复用模板基类的功能。这部分会涉及模板继承的具体语法和一些例子,以展示如何通过模板实现通用功能。...基类和派生类间的转换 在继承体系中,基类和派生类之间可以相互转换。尤其是在多态环境中,这种转换变得尤为重要。 在 C++ 中,基类和派生类之间的转换(类型转换)主要体现在指针和引用的转换。...(在派生类成员函数中,可以使用基类::基类成员显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意在实际中在继承体系⾥⾯最好不要定义同名的成员。...派生类的默认成员函数 4.1 4个常见默认成员函数 6个默认成员函数,默认的意思就是指我们不写,编译器会变我们⾃动⽣成⼀个,那么在派⽣类中,这几个成员函数是如何⽣成的呢?...继承与友元 友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员 。 友元函数或友元类可以访问类的私有成员。在继承关系中,友元允许某些特殊的函数或类访问基类和派生类的内部细节。

    16610

    C++面试知识总结

    多态:通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。...函数覆盖是指派生类函数覆盖基类函数,函数名、参数类型、返回值类型一模一样。派生类的对象会调用子类中的覆盖版本,覆盖父类中的函数版本。 隐藏”是指派生类的函数屏蔽了与其同名的基类函数。...3.5 基类和子类的构造、析构顺序 定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数 先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了 3.6 深拷贝与浅拷贝的区别...,派生类的成员函数可以访问基类中的公有和受保护成员;公有继承时基类受保护的成员,可以通过派生类对象访问但不能修改。...3.9 类成员中只能使用构造函数的初始化列表而不能赋值的有哪些 const成员 引用成员 3.10 函数模板与类模板的区别 函数模板是模板的一种,可以生成各种类型的函数实例,函数模板的实例化是由编译程序在处理函数调用时自动完成的

    1.8K41

    十一、多态

    多态的意义 提高代码的复用性和可扩展性: 多态允许使用基类类型的指针或引用来引用派生类的对象,这样就可以通过基类指针或引用来调用派生类中的方法,而无需知道具体的派生类类型。...通过在基类中将函数声明为virtual,我们可以实现多态,即使用基类类型的指针或引用来调用派生类中的成员函数。...使用场景: 当你想通过基类指针或引用来调用派生类中的成员函数时。 实现多态性,即同一接口对应不同的实现。...当通过基类指针删除派生类对象时,如果基类的析构函数不是虚的,那么只会调用基类的析构函数,而不会调用派生类的析构函数。...: 虚函数允许在派生类中重写基类的成员函数,并通过基类指针或引用来调用派生类的函数实现,从而实现多态。

    10110

    【C++】继承

    (对于派生类增加的成员,基类对象中也没有值可以赋) • 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...(在派生类成员函数中,可以使用 基类::基类成员 显示访问) 3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 4....派生类的默认成员函数 4.1 4个常见默认成员函数 类的6个默认成员函数,默认的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢? 1....派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员(在之前类文章中,我们了解到编译器默认生成的函数,对于内置类型的行为是不确定的,对于自定义类型是调用它的默认函数。...派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。 5. 派生类对象初始化先调用基类构造再调派生类构造。

    6100

    类中承上启下的角色——继承

    3、基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类 中,这几个成员函数是如何生成的呢?...派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2....派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能 保证派生类对象先清理派生类成员再清理基类成员的顺序。 5. 派生类对象初始化先调用基类构造再调派生类构造。...这里是通过了B和C的两个指针,指 向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量 可以找到下面的A。

    75730
    领券