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

强制派生类用参数实现基类构造函数

强制派生类用参数实现基类构造函数,是指在派生类中强制调用基类的构造函数,并传递相应的参数。这种方法可以确保基类的成员变量在派生类中被正确地初始化。

在C++中,可以使用初始化列表来实现这个功能。初始化列表是在类的构造函数中使用的一种特殊语法,它可以在构造函数体执行之前初始化类的成员变量。

例如,假设我们有一个基类Person和一个派生类Student,我们可以在Student的构造函数中强制调用Person的构造函数,并传递相应的参数,如下所示:

代码语言:cpp
复制
class Person {
public:
    Person(string name, int age) : m_name(name), m_age(age) {}
    // ...
private:
    string m_name;
    int m_age;
};

class Student : public Person {
public:
    Student(string name, int age, string school) : Person(name, age), m_school(school) {}
    // ...
private:
    string m_school;
};

在上面的代码中,Student的构造函数中使用了初始化列表来强制调用Person的构造函数,并传递了nameage两个参数。这样,Person类的成员变量m_namem_age就会被正确地初始化。同时,Student类的成员变量m_school也会被初始化。

需要注意的是,在初始化列表中调用基类的构造函数时,必须使用冒号:来分隔基类构造函数的参数。此外,基类的构造函数必须是可访问的,即不能是私有的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生类多态虚函数

所以的成员函数反正都要被覆盖,从某种意义上来的成员函数可以纯虚函数来代替。...任何构造函数之外的非静态函数都可以是虚函数。 关键字virtual只能出现在内部的声明语句之前而不能用于外部的函数定义。 如果把一个函数声明成虚函数,则该函数派生类中也是虚函数。...我们受保护的(protected)访问运算符说明这样的成员。 派生类必须通过使用派生列表(clss erivatin list)明确指出它是从哪个(哪些)继承而来的。...多态: 多态:静态多态,动态多态 静态多态:函数重载,运算符重载,复用函数名 动态多态:派生类和虚函数实现运行时多态 区别: 静态多态的函数地址 早绑定-》编译阶段确定函数地址 动态多态的函数地址...晚绑定-》运行阶段确定函数地址 动态多态满足关系: 1.有继承关系 2.子类重写父的虚函数 动态多态使用:父的指针或引用 指向子类对象 重写:函数返回值类型 函数参数列表 完全一致叫重写

18920

c++继承 派生类函数

参考链接: C++继承 继承    的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父中的一些东西,父也称为,子类也称为派生类派生类继承了构造函数以外的所有成员。 ...中不同访问限定符下(public、protected、private)的成员以不同的继承方式继承,在派生类中的访问限定也不同,具体如下:  的布局优先于派生类  #include<iostream...1.调用构造函数 2.调用派生类构造函数 派生类的析构可想而知: 1.调用派生类的析构函数 2.调用的析构函数  虚函数  如下程序:  class Base { public:     Base...中含有虚函数,那么布局中存在一个虚函数指针,指向虚函数表;且其派生类中与其同名同参的函数不需要加virtual也是虚函数。...此时派生类的布局如下:     vfptr的指针大小为4(32位机器)。因此字节数为8,派生类为12。

1.1K20
  • 派生类中虚函数和非虚函数的继承效果

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

    8410

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

    一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类中需要声明自己的构造函数。...派生类构造函数需要给构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象的构造次序: 先调用对象成员的构造函数,接着是构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数(从最远的开始,如果多重继承则按继承的顺序);其他对象成员若不止一个,则按定义的顺序构造,与初始化列表顺序无关。...; // 对象无法强制转化为派生类对象     return 0; } 五、派生类的转换 对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而对象无法执行这类转换.

    1.5K00

    怎么super调用超构造函数

    任何时候一个子类需要引用它直接的超,它可以关键字super来实现。super有两种通用形式。第一种调用超构造函数。第二种用来访问被子类的成员隐藏的超成员。...使用super调用超构造函数 子类可以调用超中定义的构造函数方法,super的下面形式:java复制代码super(parameter-list); 这里,parameter-list定义了超构造函数所用到的所有参数...上面的例子,调用super( )用了三个参数。既然构造函数可以被重载,可以定义的任何形式调用super( ),执行的构造函数将是与所传参数相匹配的那一个。...例如,下面是BoxWeight一个完整的实现,BoxWeight具有以不同方法构造盒子的构造函数。在每种情况下,适当的参数调用super( )。...当一个子类调用super( ),它调用它的直接超构造函数。这样,super( )总是引用调用直接的超。这甚至在多层次结构中也是成立的。

    13010

    【Kotlin】的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

    文章目录 一、主构造函数定义临时变量 二、主构造函数中定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin 中 , 可以在 声明 时 在 名后...---- 在主构造函数中 定义临时变量 , 格式为 : class 名(_临时变量名: 临时变量类型){} 在主构造函数中也可以 定义成员属性 , 格式为 : class 名(var 成员属性名:...---- Kotlin 只允许 在定义时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义在 Kotlin 内部 , 可以定义 多个 次构造函数..., 每个次构造函数都可以有不同的参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数参数设置 参数值 ; 次构造函数中可以实现代码逻辑 , 作为主构造函数的补充 ; 代码示例..., 可以不为其传递 值参 , 构造函数中跳过该参数 , 其 后面的参数需要使用 参数名 = 参数值 进行赋值 ; 代码示例 : class Hello( // 主构造函数, 直接在主构造函数中定义属性

    4.8K20

    Aop动态生成代理时支持带参数构造函数

    一、背景   在某些情况下,我们需要植入AOP代码的并没有默认构造函数。那么此时动态生成的代理也需要相同签名的构造函数,并且内部调用原始构造函数。...二、梳理功能点   在已支持通过默认构造函数进行AOP代码植入的情况下(以前发过一篇博文,传送门:大家一起Aop),实现该功能我们需要做的是:   1.如何通过获取原始构造函数参数列表,并使用Emit...生成代理的相应构造函数。   ...2.如何创建并保存实例化代理的委托,加快实例化速度。 三、实现方案   功能1:   在原来的生成代理,代理中的方法处增加生成构造函数的代码。...到这里我们的动态构造已经完成了,接下去解决功能2:   这里只要在原先直接取默认构造函数的地方增加一个判断,获取指定参数构造函数构造委托。

    1.2K20

    C++进阶-继承

    子类和父中有同名成员子类成员将屏蔽父对同名成员的直接访问,这种情况叫隐藏,也叫重定义(在子类成员函数中,可以使用 ::成员 显示访问) 注:在同一作用域函数名相同参数不同,为函数重载...;如果没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用 注:默认构造函数:无参的构造函数,编译器自动生成的构造函数,全缺省的构造函数 示图:无默认构造函数,且不显示调用 派生类的拷贝构造函数必须调用的拷贝构造完成的拷贝初始化...:一般不自行去主动调用的析构函数,不然可能会造成错误 派生类对象初始化先调用构造再调派生类构造 派生类对象析构清理先调用派生类析构再调的析构 示图: 五、继承和友元 概念:...什么时候组合 区别: 继承相当于每个派生类对象都是一个对象;继承中的内部实现派生类可见(一定程度破坏的封装性),可以根据实现来决定派生类实现(耦合度高,不利于维护)...将该类的构造函数的访问权限设置为私有,当派生类调用构造函数时,会先调用父构造函数,而父构造函数不能被调用,无法构造对象也就构造不了派生类对象(但这样的不仅派生类无法构造,该类自己也不能构造

    45850

    【笔记】《C++Primer》—— 第15章:面向对象程序设计

    ,使用多态的一大目的是防止出现大量的重载函数 这里要强调下两个术语: 覆盖(重写) override,指重新实现了一个名称和参数都一样的方法 重载 overload,指对一个同名方法进行了几种不同参数实现...任何构造函数以外的非静态函数都可以是虚函数,如果声明了虚函数,那么派生类中的对应函数都隐式的是虚函数 通过抽象,我们使用动态绑定可以实现接口与实现的分离,函数声明出接口,然后指针指向不同的派生类实现来动态调用...这里有一个特别的,即便处理的是指针,此指针指向某派生类,我们也不能隐式转换到这个派生类,如果中含有虚函数,我们可用用dynamic_cast强制转换 15.3 虚函数 通过对的指针或引用来调用虚函数时会出现动态绑定...因此编译器在构造和析构的时候只往搜索来得到所需的成员 C11中,我们可以using重用定义的构造函数,写法和15.6中指明重载的函数一样,效果与定义一个空的构造函数然后列表中调用构造函数一致...,除了: 派生类通过定义相同的参数列表只继承没有定义的那部分,自定义其他的部分 默认,拷贝和移动构造函数不会被继承,这些函数会被派生类默认合成 15.8 容器与继承 当我们想要把继承体系的对象存放到容器中时

    52320

    常见c和cpp面试题目汇总(一)

    封装隐藏了实现细节,使得代码模块化;派生类可以继承父的数据和方法,扩展了已经存在的模块,实现了代码重用;多态则是“一个接口,多种实现”,通过派生类重写父的虚函数实现了接口的重用。...关键字可有可无 override,派生类覆盖的虚函数实现接口的重用;特征:不同范围(派生类)、函数名字相同、参数相同、中必须有virtual关键字(必须是虚函数) overwrite,派生类屏蔽了其同名的函数...;特征:不同范围(派生类)、函数名字相同、参数不同或者参数相同且无virtual关键字 六、new、delete、malloc、free之间的关系: new/delete,malloc/free...九、虚函数是怎么实现的: 每一个含有虚函数都至少有有一个与之对应的虚函数表,其中存放着该类所有虚函数对应的函数指针(地址);的示例对象不包含虚函数表,只有虚指针;派生类会生成一个兼容的虚函数表...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类指针时,只会调用的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。

    1.4K31

    C++:28 --- C++内存布局(上)

    VC++在虚表中增加了一些额外的项,这些项保存了从派生类到其各层虚的偏移量。 3 强制转化 如果没有虚的问题,将一个指针强制转化为另一个类型的指针代价并不高昂。...一般说来,当从派生类中访问虚成员时,应该先强制转化派生类指针为虚指针,然后一直使用虚指针来访问虚成员变量。这样做,可以避免每次都要计算虚地址的开销。 见下例。...最坏的情况下,一个构造函数要执行如下操作: 1 * 如果是“最终派生类”,初始化vbptr成员变量,调用虚构造函数; 2 * 调用非虚构造函数 3 * 调用成员变量的构造函数 4 * 初始化虚函数表成员变量...5 * 执行构造函数体中,程序所定义的其他初始化代码 (注意:一个“最终派生类”的实例,一定不是嵌套在其他派生类实例中的实例) 所以,如果你有一个包含虚函数的很深的继承层次,即使该继承层次由单继承构成...“最终派生类”,调用虚的析构函数(按照相反顺序) 在VC++中,有虚构造函数接受一个隐藏的“最终派生类标志”,标示虚是否需要初始化。

    1.1K20

    C++设计的注意事项

    同理,如果要做到不同类之间的赋值(也包括赋值给派生类),要么做强制类型转换再赋值,要么定义一个特定参数的赋值操作函数。 赋值操作符也是不能被继承的,毕竟其特征标(参数列表)随而异。...//注意这个函数参数应该是引用,但是引用是可以指向子类的,它只会操作的成员 ...// 操作派生类的成员 return *this; } 析构函数 一定要注意显式定义析构函数来释放构造函数使用...的析构函数最好定义成虚函数(virtual),这样当释放一个指针指向的派生类时,也会自动先调用派生类的析构函数,然后才调用的析构函数,否则会只调用的析构函数,这样派生类new初始化的成员将得不到释放...另外,也由于C++支持的引用指向派生类时,对于虚函数会调用其真实类型的函数,这保证了灵活的使用。只是要注意如果在函数中不修改对象,最好用const修饰对象参数,避免修改。...调用派生类的方法,如果不用virtual修饰,则调用方法 当然,如果要能做到分开调用,在派生类中也要一模一样的定义一个方法(参数列表要一致),此时virtual修饰与否都可以,毕竟已经修饰过了

    39220

    【C++】继承

    对象不能赋值给派生类对象。 的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是的指针是指向派生类对象时才是安全的。...要注意的是第三条,如果派生类函数名相同但参数不同,不会构成函数重载,也派生类对象也无法调用中的函数,如下: class A { public: void fun(int c) {...派生类构造函数必须调用构造函数初始化的那一部分成员。如果没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2....派生类的拷贝构造函数必须调用的拷贝构造完成的拷贝初始化。 3. 派生类的operator=必须要调用的operator=完成的复制。 4....派生类对象初始化 先调用构造再调派生类构造 。 6. 派生类对象析构清理 先调用派生类析构再调的析构 。 7.

    10910

    C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则

    派生类释放时,先执行派生类的析构函数,再执行的析构函数 二、继承中被删除的函数的语法 派生类可以将其构造函数或者拷贝控制成员定义为删除的。...,不仅需要构造自己的成员,还需要构造属于的成员 这与构造函数不同: 如果构造函数派生类必须在构造函数的初始化列表构造继承(这是强制的) 而拷贝构造函数/移动构造函数不是强制的,因此如果你没有拷贝...} }; 五、特别注意:在构造函数和析构函数中调用虚函数 根据构造函数,析构函数我们知道: 派生类构造时,先构造部分,然后再构造派生类部分 派生类析构时,先析构派生类部分,然后再析构部分 因此.../* B(参数)::A(参数1, 参数2) {} //其中两个参数都要给出 B(参数)::A(参数1) {} //其中只要给出第一个参数 */ }; 规则④:如果含有几个构造函数,除了两个例外情况...,否则派生类将继承的所有构造函数 1.如果派生类定义了一个构造函数构造函数具有相同的参数列表,则在用这个构造函数创建派生类时,执行的是派生类的那个,因为的那个没有被继承(也可以被理解为覆盖了

    1.4K30

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

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

    1.7K10

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

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

    70610

    C++primer学习笔记(六)

    可以使用域操作符强制调用函数【虚中调虚】。函数派生类的默认实参要一致。...派生类继承的访问控制标号【何种方式继承】无论是什么,不影响派生类使用成员,但影响使用派生类的用户访问成员。使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...如果知道派生类的转换【这种转换是地址赋给派生类指针】是安全的【就是说心里清楚指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...构造函数无法继承,派生类构造数还要初始化【否则只能用合成构造函数初始化】。初始化列表和初始化的顺序无关。只能初始化直接。...构造函数是对象动态类型确定之前运行的,不需要定义为virtual。 引用、对象、指针的静态类型决定了能够完成的行为,动态类型有多的功能也无法使用。派生类应避免与成员名字冲突。

    1.1K20

    【C++进阶】多态的理解

    重写析构函数 其实编译后析构函数的名称统一处理成destructor,此时析构函数函数名相同,参数列表也相同,再加上 virtual  修饰,此时就重写了派生类中的析构函数,即构成了多态。...重载,重定义(隐藏)与重写 重载:在同一作用域,函数名相同,返回值可以不同,参数列表必须不同; 重定义(隐藏):在不同的作用域,一个在,一个在派生类,只要函数名相同就构成重定义; 重写:1.在不同的作用域...,一个在,一个在派生类;            2.都必须是虚函数;            3.满足三同(函数名,返回值,参数列表相同(协变除外)); 总结 1.重写比重定义的条件更加严苛; 2.两个派生类的同名函数...虚表生成 虚表指针其实是在初始化列表阶段初始化的,所以构造函数不能设置成虚函数; 虚表生成:                   a.先将中的虚表内容拷贝一份到派生类虚表中 ;                  ...b.如果派生类重写了中某个虚函数派生类自己的虚函数覆盖虚表中的虚函                       数;                   c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后

    11710

    C++复习大全(各种知识点)

    由于s是拷贝构造 plato 的,那就会调用一次派生类拷贝构造,而派生类又会调用的拷贝构造,这就已经是两次了,对应的,既然调用了两次拷贝构造,那就会调用两次析构函数。...然后再分析,派生类中的对象继承了的对象,所以总共有四个string 对象,那么又会调用四次构造函数,对应四次析构函数最后得出结论,代码(2)总共调用了六次构造函数和六次析构函数但是,如果传递的是引用的话...因为没有任何新的对象被建立,以引用传递也可以避免对象切割问题,当一个派生类以值传递的方式将会被声明为对象,的拷贝构造函数被调用,造成派生类的特化性质全被切割为了解决切割问题,我们可以给函数参数传入一个...抽象则进一步,它把数据和函数实现都隐藏在实现中,而在抽象中提供丰富的接口函数供调用,这些函数都是public的纯虚函数,这样的抽象叫做接口。 ...class之外,但是不同的是它们不需要this指针参数的静态成员也会被派生类继承,但这种继承并不是继承它们的实体,而是使得它们能在派生类中直接访问。

    1.1K20

    C++进阶:详细讲解继承

    (在子类成员函数中,可以使用 ::成员来显示访问父的) 需要注意的是如果是成员函数的隐藏,只需要函数名相同(返回值和参数数量、类型可以不同)就构成隐藏。...4.1构造函数 派生类构造函数必须调用构造函数初始化的那一部分成员。...如果没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用(顺序是先父后子)。...派生类对象初始化先调用构造再调派生类构造 派生类的拷贝构造函数必须调用的拷贝构造完成的拷贝初始化 4.2重载=和析构函数 派生类的operator=必须要调用的operator...不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。之间的关系可以继承,可以组合,就用组合 继承讲完了,那下次肯定就是多态啦!!!感谢大家支持!!!

    15310
    领券