首页
学习
活动
专区
圈层
工具
发布

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

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

89410

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

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。...从输出可以看出: 派生类对象的构造次序: 先调用基类对象成员的构造函数,接着是基类的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...初始化列表参数多个且其中有调用基类构造函数时,先执行基类构造函数(从最远的开始,如果多重继承则按继承的顺序);其他对象成员若不止一个,则按定义的顺序构造,与初始化列表顺序无关。...向下转型不安全,没有自动转换的机制 // 从语法上来演示基类对象可以转化为派生类对象,但是没有意义 1、转换构造函数: Manager(const Employee& other) : Employee

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

    【C++】继承 - 从基类到派生类的代码复用逻辑

    派生类的构造函数必须调用基类的构造函数初始化基类的那⼀部分成员。 如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。...派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 派生类的operator=必须要调用基类的operator=完成基类的复制。...需要注意的是派生类的operator=隐藏了基类的operator=,所以显示调用基类的operator=,需要指定基类作用域。 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。...,所以要指定类域 //派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员 } protected: int _num; //学号 string _address; };...,派生类的构成必须调用基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。

    53110

    c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

    大家好,又见面了,我是全栈君 测试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...endl; } }; 測试代码: int main() { A a; A *a1; cout调用基类的构造函数..."<<endl; A *a2=new A; //仅仅有在new 一个对象的时候才会调用基类的构造函数 cout调用基类的构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数...而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此。

    93910

    【c++】继承学习(二):探索 C++ 中派生类的默认机制与静态成员共享

    ,对内置类型不做处理,对自定义类型调用它的默认构造函数,规则和以前一样 派生类里面,把父类成员当做一个整体 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。...如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用 比如的父类的构造函数修改成这种: Person(const char* name) : _name(name) { cout...上面的修改确保当创建Student 类的对象时,它会首先调用 Person 类的构造函数初始化 _name,然后初始化派生类 Student 的 _num 成员 派生类这里分成了两个部分:父类和自己...因此,基类的构造函数总是首先被调用,再是派生类中定义的成员变量 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化,一般情况下默认生成的就够用,如果涉及到深拷贝,就需要自己显示实现 Student..._num; } return *this; } 这里同名函数构成了隐藏 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。

    30810

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    (实际上是继承了但不可见),如果在派生类的成员函数中想要调用基类的被隐藏函数,可以使用 “ 基类名::函数名(参数)”的语法形式,如果被隐藏的函数是public的,则在类体外也可以使用“ 派生类对象.基类名...::函数名(参数)” 的语法,也可用“ 派生类指针->基类名::函数名(参数)”的语法,同理被隐藏的数据成员也可以使用上述列举的方法访问。...首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。...那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。 可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?...调用try的构造函数时,会先调用它包含的所有virtual base类的构造函数,然后再调用它上层的base类构造函数,然后是设置vptr,最后是初始化列表和子类构造函数体内的用户代码。

    1.4K00

    类继承

    我们在使用类库进行开发时候,如果需要对类库进行修改和扩展,我们就需要在类库的源代码中修改他(如果他是公开的源代码),但是C++++提供了更为简单和易操作的方法,叫做类继承,它可以从已有的类派生新的类,而派生类继承了原有类...比如我们这个派生类中就有单科成绩的数据成员 现在我们为他加上构造函数和成员函数 派生类构造函数不能直接访问基类的数据,那要怎么设置基类的数据呢,那就是调用基类的方法,也就是说我们要写派生类的构造函数必须使用基类构造函数...总结以下要点 首先会创建基类对象 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数 派生类构造函数应初始化派生类新增的数据成员 释放对象的顺序与创建对象的顺序相反,首先执行派生类的析构函数...数据成员 //Cxiao xiaostudent我们知道派生类需要初始化自身和基类的数据,这里我显式调用了基类的构造函数Student进行初始化 对应参数赋值 在创建完成基类之后 我们需要初始化子类的数据成员...则会自动调用默认的基类构造函数 showsource派生类的成员函数,用来展示派生类的三科成绩以及通过函数columntotal访问到了基类的数据成员Total_source 并且输出了他 resetsource

    39720

    C++复习知识点(仅供参考)

    5>默认析构函数             (只有一个,无参数/每个参数都有默认值,无函数体) 构造函数与析构函数调用顺序:先构造后析构,后构造先析构 引用--1>已经定义的变量的别名,不为其分配内存空间...; } //所列出的成员对象名全部为新增成员对象的名字 5〉派生类构造函数各部分执行次序: a.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。...b.调用成员对象的构造函数,按它们在类定义中声明的先后顺序调用。 c.派生类的构造函数体中的操作。 //注意: 1.如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的默认构造函数。...6>析构函数调用次序与构造函数相反 多重继承 1〉基类构造函数的调用顺序: 派生类构造函数执行顺序是先执行所有基类的构造函数,再执行派生类本身构造函数。...: 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。

    19210

    【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”

    基类对象,丢失派生类特有成员lives 虚函数调用:由于切片后对象类型为Animal,调用基类的speak()。...派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显式调用基类的构造函数。...派生类的拷贝构造函数必须调用基类的拷贝构造函数完成基类的拷贝初始化。 派生类的 operator= 必须调用基类的 operator= 完成基类的复制。...派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。这是为了保证派生类对象先清理派生类成员、再清理基类成员的顺序。 派生类对象初始化时,先调用基类构造函数,再调用派生类构造函数。...默认构造函数 (Derived() = default;) 基类构造规则: 自动调用 基类的默认构造函数。 若基类无默认构造函数,必须显式调用基类的其他构造函数。

    49110

    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...: 构造函数 : 父类 -> 成员 -> 自身 ; 首先 , 调用 父类 构造函数 ; 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型的 构造函数 ; 最后 , 调用 自己 构造函数 ;...; A 和 B 的构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数的调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述的调用原则...; 然后分析 析构函数 调用顺序 ; C 析构函数 , 是 自身构造函数 ; D 析构函数 , 是 成员构造函数 ; A 和 B 的析构函数 , 是 父类构造函数 ; 析构函数的调用顺序为 : 自身

    78310

    十、继承

    注意访问权限:在继承时,要注意基类成员的访问权限,确保派生类能够访问到需要的成员。 构造函数和析构函数:派生类的构造函数需要调用基类的构造函数来初始化继承来的成员。...在派生类构造函数中,可以通过成员初始化列表显式地调用基类的构造函数。 派生类可以覆盖(Override)基类的虚函数,以提供特定于派生类的实现。这是多态性的基础之一。...从内存布局的角度看,派生类对象中确实包含了这些私有成员。 访问权限的变更仅影响继承后的成员的访问方式,不会改变基类中成员本身的访问权限。...构造函数 构造函数是特殊的成员函数,用于在对象创建时初始化对象。 基类的构造函数:在创建派生类对象时,首先会调用基类的构造函数(如果有的话)。...如果基类有多个构造函数,派生类构造函数可以通过初始化列表来指定使用哪一个。 派生类的构造函数:派生类的构造函数可以初始化派生类特有的成员变量,并且可以通过初始化列表来调用基类的构造函数。

    39010

    复用

    从外部看,派生类对象拥有基类的接口,还可能有自己新增的方法和属性。...3.基类构造函数调用 派生类构造函数首行隐式或显式调用基类构造函数(super(...)): 若基类有无参构造函数,自动插入super()。...若基类只有有参构造函数,派生类必须显式用super(参数)调用,否则编译报错。 执行基类构造函数中的代码,可能修改基类成员的值。...基类构造函数带参数的场景 当基类的构造函数包含参数(即没有无参构造函数)时,派生类必须在构造函数中显式调用基类的有参构造函数,否则编译会报错。...显式调用基类有参构造函数 若基类没有无参构造函数(如Game(int i)),派生类必须在构造函数首行用super(参数)显式调用基类的有参构造函数,否则编译器报错(找不到基类无参构造函数)。

    17200

    搞清楚,易如反掌。(暑假提升-继承专题)

    需要注意的是!这里是隐蔽而不是函数重载,重载和隐蔽是两码事! 2、5、派生类默认成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。...如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。...派生类的operator=必须要调用基类的operator=完成基类的复制。 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。...因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。 派生类对象初始化先调用基类构造再调派生类构造。 派生类对象析构清理先调用派生类析构再调基类的析构。...从内存中能够观察到D对象内部,A,B与C到底怎么储存的,能够类似于类中的函数一样,将A中的a放在最后一个类似于公共的区域,让a只存在一个,改变修改相同的一个a。

    14610

    C++基础-继承

    a, b) {}; Derived(int a, string b) : Base(a, b) {}; }; 1.3 派生类调用基类构造函数 派生类调用基类构造函数有三种形式: 如果基类有默认构造函数...,派生类构造函数会隐式调用基类默认构造函数,这由编译器实现,不需编写调用代码; 如果基类没有默认构造函数,即基类提供了重载的构造函数,则派生类构造函数通过初始化列表来调用基类构造函数,这属于显式调用。...这种方式是必需的,否则编译器会试图调用基类默认构造函数,而基类并无默认构造函数,编译会出错; 在派生类构造函数中,使用 ::Base() 形式显示调用基类构造函数。...和基类普通函数的调用方式不同,派生类中调用基类普通函数的形式为 Base::Function()(需要指定类名)。...如果基类包含重载的构造函数,需要在实例化时给它提供实参,则创建派生类对象时,可以使用初始化列表,并通过派生类的构造函数调用合适的基类构造函数。

    1.2K20

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

    在程序修改前,是无法通过基类指针去调用派生类对象中的成员函数的。...虚函数突破了这一限制,在派生类的基类部分中,派生类的虚函数取代了基类原来的虚函数,因此在使基类指针指向派生类对象后,调用虚函数时就调用了派生类的虚函数。...要注意的是,只有用virtual声明了虚函数后才具有以上作用。如果不声明为虚函数,企图通过基类指针调用派生类的非虚函数是不行的。 虚函数的以上功能是很有实用意义的。...但是,从基类继承来的某些成员函数不完全适应派生类的需要,例如在例12.2中,基类的display函数只输出基类的数据,而派生类的display函数需要输出派生类的数据。...可以看到:当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。

    1.6K80

    c#对象初始化顺序

    先变量后构造函数。变量先被初始化,然后构造函数被执行 2. 先静态化后实例化。当一个类被访问时,静态变量和构造函数最先被初始化.接着是对象的实例化变量和构造函数被初始化 3. 先派生类后基类。...对于实例构造函数,基类构造函数在派生类构造函数之前执行,实例构造函数被执行次序是A-B-C. 5. 不要假定变量的次序。...如果类里面有成员类,成员类的构造函数优先被调用; 2. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类); 3....基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序; 4....派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现

    1.6K10

    C++之面向对象的三个基本特征

    如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。...需要说明;有时在基类中定义的非虚函数会在派生类中被重新定义(如例12.1中的area函数),如果用基类指针调用该成员函数,则系统会调用对象中基类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数...主要考虑一下几点 1)首先看成员函数所在的类是否是基类;然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数; 2)如果成员函数在类被继承后功能无需修改,或派生类用不到该函数...虚析构函数 析构函数的作用是在对象撤销之前做必要的“清理现场”工作;当派生类的对象从内存中撤销时,一般先调用派生类的析构函数,再调用基类的析构函数。...从运行结果可以看出,执行delete p;语句时只调用了基类的析构函数,却没有调用派生类的析构函数。

    1.3K60

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

    一.继承的概念及定义 1.1继承的概念 继承是面向对象语言特性之一,它允许一个类(派生类)从另一个类(基类)中,继承其属性和方法。...派生类的构造函数必须调用基类的构造函数初始化基类的那部分成员。...如果没有在基类中实现默认构造,在派生类的构造函数的初始化列表阶段显示调用,需要将基类当为一个整体进行初始化 在初识化列表中初始化的顺序根据声明的前后顺序,基类最先出现,先初始化基类 基类没有提供构造...基类中不存在默认构造,派生类不会自动生成 先构造基类,然后构造派生类 拷贝构造 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化 想要显示调用基类的构造函数,就只能通过初始化列表完成...然后析构派生类 此时析构派生类对象的时候会一起将 先析构基类,在析构派生类 4.2实现一个无法被继承的类 基类的构造函数私有,派生类的构成必须调用基类的构造函数,但是基类的构造函数私有化后,派生类看不见无法调用

    30710

    【C++进阶篇】像传承家族宝藏一样理解C++继承

    5.2.1 构造函数的调用顺序 派生类对象构造过程中,基类的对象会首先调用构造函数进行初始化,其次派生类再调用构造函数进行初始化。...如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。...从结果可以看出,先调用父类的构造,然后再调用派生类的构造函数。这种调用顺序确保基类的成员在派生类构造之前就已经被正确初始化。...5.2.2 拷贝构造函数与赋值运算符的调用 当派生类对象被拷贝时,基类的拷贝构造函数会先被调用,然后才是派生类的拷贝构造函数。...从结果可以看出基类的拷贝构造和赋值运算符重载优先级优于派生类。为了保证派生类对象的完整性,派生类的拷贝构造函数和赋值运算符必须调用基类的相应函数,确保基类成员正确处理。

    40610

    C++:继承与派生

    派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2....派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 3. 派生类的operator=必须要调用基类的operator=完成基类的复制。...4、派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能 保证派生类对象先清理派生类成员再清理基类成员的顺序。 5....派生类对象初始化先调用基类构造再调派生类构造,派生类对象析构清理先调用派生类析构再调基类的析构。...设置一个静态成员变量,然后在基类的构造函数里++ 如上图,我们可以发现如果把静态成员设为公有,那么就会出现可以修改的情况,所以我们最好把静态成员变量设成私有,然后用写一个静态成员函数getcount去获取结果

    31110
    领券