【C++】子类如何调用父类的有参构造

C++中子类调用父类的有参构造函数_fchyang的博客-CSDN博客_c++子类构造函数调用父类构造函数

c++ 子类调用父类有参构造函数_奔跑的龙少的博客-CSDN博客_c++子类调用父类构造函数

 

不调用父类构造函数 会导致什么结果 ???

在C++中子类继承和调用父类的构造函数方法_hemmingway的博客-CSDN博客_c++ 调用父类构造函数

1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

 

 

#include <iostream>
#include <vector>

using namespace std;
/*  1 子类 调用 父类有参构造   如果子类重写了变量, 不在子类构造函数里赋值的话 ,不能初始化子类重写后的 变量
    2 子类可以继承父类的变量
    疑问的来源:
  https://www.behaviortree.dev/tutorial_08_additional_args/
Action_A(const std::string& name, const NodeConfiguration& config, int arg1, double arg2, std::string arg3 ): SyncActionNode(name, config), // 不用初始化 子类自己的这两个变量??? 答 不用 , 因为会继承父类的变量 _arg1(arg1), _arg2(arg2), _arg3(arg3) {}

  3  在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
*/ class A { public: A() { printf("A(void) \n"); } A(int d): n(d) { std::cout << " A constructor para n " << n << std::endl; } int n; }; class B : public A { public: B(int x) : A(x) {} // B 的 n 不会被 初始化 int n; }; class Student { public: Student(string nam) { name = nam; } ~Student(){} // protected: string name; }; class Student1:public Student{ public : Student1(string nam, int num) :Student(nam) // 父类没有无参构造函数,必须初始化父类 { age = num; } ~Student1(){} // protected: int age; }; int main(int argc, char** argv) { B b(9); std::cout << " b.n " << b.n << std::endl; Student1 stu("abc",19); std::cout << " stu.nam " << stu.name << " stu.num " << stu.age << std::endl;
return 1; }

 

输出:

 A constructor para n 9
 b.n 21974
 stu.nam abc stu.num 19

 

posted @ 2022-08-09 16:17  星火-AI  阅读(1049)  评论(0编辑  收藏  举报