精华内容
下载资源
问答
  • C++之子类构造函数写法总结

    千次阅读 2018-05-07 22:33:05
    最近几天在看《C++编程实战》的时候,在一段代码中遇到了C++继承的构造函数该怎么写的问题,当时不是很明白。后来,自己上网查阅相关的资料,终于把这个问题搞清楚了。为了自己以后的不时之需,特地将其进行了一个...

    最近几天在看《C++编程实战》的时候,在一段代码中遇到了C++继承的构造函数该怎么写的问题,当时不是很明白。后来,自己上网查阅相关的资料,终于把这个问题搞清楚了。为了自己以后的不时之需,特地将其进行了一个简要的总结。

           我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。

           构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结如下,欢迎大家指导与批评。

             1.父类没有声明构造函数

             (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。

             (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。

             2.父类只声明了无参构造函数

             如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。

             3.父类只声明了带参构造函数

             在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。关于构造函数的显示调用,参见下例。


    最近几天在看《C++编程实战》的时候,在一段代码中遇到了C++继承的构造函数该怎么写的问题,当时不是很明白。后来,自己上网查阅相关的资料,终于把这个问题搞清楚了。为了自己以后的不时之需,特地将其进行了一个简要的总结。

           我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。

           构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结如下,欢迎大家指导与批评。

             1.父类没有声明构造函数

             (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。

             (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。

             2.父类只声明了无参构造函数

             如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。

             3.父类只声明了带参构造函数

             在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。关于构造函数的显示调用,参见下例。

    最近几天在看《C++编程实战》的时候,在一段代码中遇到了C++继承的构造函数该怎么写的问题,当时不是很明白。后来,自己上网查阅相关的资料,终于把这个问题搞清楚了。为了自己以后的不时之需,特地将其进行了一个简要的总结。

           我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。

           构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结如下,欢迎大家指导与批评。

             1.父类没有声明构造函数

             (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。

             (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。

             2.父类只声明了无参构造函数

             如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。

             3.父类只声明了带参构造函数

             在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。关于构造函数的显示调用,参见下例。

    class animal
    {
    protected:       //成员变量,声明为protected或者public,这里选择protected
    	int height;  //若声明为private,则不能被子类继承访问,会报错
    	int weight;
    public:
    	animal(int height,int weight)   //带参的构造函数
    	{
    		this->height=height;
    		this->weight=weight;
    		cout<<"animal的带参构造函数被调用"<<endl;
    	}
    	virtual ~animal()
    	{
    		cout<<"animal的析构函数被调用"<<endl;
    	}
    };
    //子类
    class fish:public animal
    {
    public:
    	fish():animal(height,weight) //显示调用父类的构造函数
    	{
    		cout<<"fish的构造函数被调用"<<endl;
    	}
    	virtual ~fish()
    	{
    		cout<<"fish的析构函数被调用"<<endl;
    	}
    };

    在子类fish的构造函数中,加上一个冒号(:),然后加上父类的带参构造函数,这就是父类构造函数的显式调用。这样,在子类的构造函数被调用时,系统就会去调用父类的带参构造函数,从而实现初始化父类的成员变量。运行结果如下:

           

      4.父类同时声明了无参和带参构造函数

             在这种情况下,子类只需要实现父类的一个构造函数即可,不管是无参的还是带参的构造函数。如果子类的构造函数没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数。

    //父类
    class animal
    {
    protected:       //成员变量,声明为protected或者public,这里选择protected
    	int height;  //若声明为private,则不能被子类继承访问,会报错
    	int weight;
    public:	
    	animal()
    	{
    		height=0;
    		weight=0;
    		cout<<"animal的无参构造函数被调用"<<endl;
    	}
    	animal(int height,int weight)   //带参的构造函数
    	{
    		this->height=height;
    		this->weight=weight;
    		cout<<"animal的带参构造函数被调用"<<endl;
    	}
    	virtual ~animal()
    	{
    		cout<<"animal的析构函数被调用"<<endl;
    	}
    };
    //子类
    class fish:public animal
    {
    public:
    	fish()     //没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数
    	{
    		cout<<"fish的构造函数被调用"<<endl;
    	}
    	virtual ~fish()
    	{
    		cout<<"fish的析构函数被调用"<<endl;
    	}
    };

    运行结果如下:



    总结以上几条,可以归纳出C++中子类继承父类时构造函数的写法的规律:当父类有显式地声明了构造函数时,子类最低限度的实现父类中的一个;当父类没有声明构造函数时,子类可以不声明构造函数或者任意地书写构造函数。


    展开全文
  • 如果子类构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类构造函数的构造原则,总结如下,欢迎大家指导与批评。  1.父类没有声明构造...
  • C++子类构造函数

    2019-07-19 23:54:04
    构造函数是用来初始化类对象的。如果类中没有显式的声明构造函数,那么编译器会自动创建一个默认的构造函数,并且这个...如果子类构造函数没有显式地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么...

    构造函数是用来初始化类对象的。如果类中没有显式的声明构造函数,那么编译器会自动创建一个默认的构造函数,并且这个默认的构造函数仅仅在没有显式的声明构造函数的情况下才会被创建。

    构造函数与父类的其它成员不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显式地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么是显式调用,在下面会详细说明。

    关于子类中构造函数的构造原则,总结如下:

    1. 父类中没有声明构造函数
      (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。
      (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,编译器会自动生成父类默认的构造参数,然后再调用子类的构造函数。

    2. 父类只声明了无参构造函数
      如果子类的构造函数没有显式的调用父类的构造函数,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式的调用。

    3. 父类只声明了带参构造函数
      在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。关于构造函数的显示调用,参见下例。

    #include <iostream>
    using namespace std;
    class Student{
    public:
    	Student(int n): num(n){}
    	~Student(){}
    protected:
    	int num;
    };
    
    class Student1: public Student{
    public:
    	Student1(int n, int m): Student(n), age(m){}
    	~Student1(){}
    	void display(){
    		cout << "num=" << num << endl;
    		cout << "age=" << age << endl;
    	}
    private:
    	int age;
    };
    
    void main()
    {
    	Student1 stu1(23,12);
    	stu1.display();
    }
    

    Reference:
    https://blog.csdn.net/sevenjoin/article/details/82222895
    https://blog.csdn.net/xckkcxxck/article/details/70045218

    展开全文
  • 我们先来建立一个父类,一个子类,一个子类子类 class BaseClass { private string name = "BaseClass"; public BaseClass() { Console.WriteLine(name); } } clas...

     

    我们先来建立一个父类,一个子类,一个子类的子类

    
        class BaseClass
        {
            private string name = "BaseClass";
    
            public BaseClass()
            {
                Console.WriteLine(name);
            }
        }
    
    
        class SubClass1:BaseClass
        {
            private string name = "SubClass1";
    
            public SubClass1()
            {
                Console.WriteLine(name);
            }
        }
    
        class SubClass1_1:SubClass1
        {
            private string name = "SubClass1_1";
    
            public SubClass1_1()
            {
                Console.WriteLine(name);
            }
        }

    在构造函数中分别输出对应类内建立的私有变量name

    在主函数中,输入

                BaseClass bc=new SubClass1_1();

    然后,运行

     

    先 想 一 想 输 入 是 什 么 ……

     

    5

    4

    3

    2

    1

     

    揭晓答案

    我们看到,首先输出了父类BaseClass的变量值,然后是SubClass1,最后才是SubClass1_1的。

     

    实例化父类时,可以通过new子类来实例化父类,执行构造函数的顺序为:先执行父类的构造函数,再执行子类的构造函数

     

     

    再见

    展开全文
  • ②:子类构造过程中,必定会调用其父类的构造方法,就算我们没有写,编译器也会隐式的帮助我们使用super()来调用父类的无参构造方法。 所以在这里进行子类的new时,会先打印父类的无参构造的...
    1. 首先看一下这几个代码的执行结果
      在这里插入图片描述

    结果:
    在这里插入图片描述

    ①:每个类在构造的时候,都会有一个默认的无参构造方法;就算我们不写,编译器也会帮助我们生成一个默认的构造方法;但是如果我们写了,那么会使用我们自己写的构造方法。
    ②:子类的构造过程中,必定会调用其父类的构造方法,就算我们没有写,编译器也会隐式的帮助我们使用super()来调用父类的无参构造方法。
    所以在这里进行子类的new时,会先打印父类的无参构造的方法,再调用子类本类的无参构造。

    1. 子类中无参构造方法调用了本类的重载构造
      在这里插入图片描述
      结果:
      在这里插入图片描述
      在第一个中,子类无参构造方法中,隐式调用了super(),类似下图这样的操作;
      在这里插入图片描述
      所以在new一个子类的时候,会先将父类无参构造的方法中的内容打印出来,然后再打印子类无参构造方法中的内容;
      那么这里是怎么回事?正常来说,如果还是在子类无参构造方法中,是不能先调用super()的,如下图:
      在这里插入图片描述
      那么super()就不是在子类无参构造中调用的,再看一下下面的代码:
      在这里插入图片描述
      代码写成这样后,打印的结果和上面没有在子类重载构造中写super()是一样的,那么就是说,在子类无参构造方法中,使用this调用本类的重载构造方法,那么在子类的无参构造方法中是不能再调用父类的无参构造,也就是没有使用super(),但是子类构造是必须要调用父类构造的,所以就在子类的重载构造中调用了父类的无参构造方法。
      再说明一下执行顺序,不管代码写的时候的调用顺序如何,都是先执行父类的无参构造,再执行子类的无参构造的。

    2. 校验一下上面的总结
      在这里插入图片描述

    展开全文
  • 子类构造函数

    千次阅读 2017-09-01 17:24:50
    基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的...
  • C++继承中关于子类构造函数的写法

    千次阅读 2017-03-07 20:50:02
    C++继承中关于子类构造函数的写法 转载于:http://www.cnblogs.com/kaige/p/cplusplus_virtual_inheritance_derived_class_constructor.html 构造方法用来初始化类的对象,与父类
  • c++ 子类构造函数初始化及父类构造初始化

    万次阅读 多人点赞 2018-08-30 15:58:50
    我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的...如果子类构造函数没有显示地调...
  • c++ 子类父类构造函数

    2020-05-07 00:19:28
    1楼 这两天一直搞不明白C++继承的构造函数该怎么写。现在经过实验,总结出了一些观点。...例如:父类为CA,子类为CB,父类中没有写出任何构造函数,则子类中可以不写构造函数,或者构造函数可以写成以下几...
  • 假如父类构造函数只存在有参构造,在子类对象实例化之前,便需要创建一个父类对象,在不存在默认无参构造情况下,系统时不知道怎么为你创建父类对象的。 解决上述问题的办法,就是在子类创建时指定父类初始化方式,...
  • 在使用new进行对象创建时,其实是调用了其相关类的构造方法。也就是说,对象创建时,最先执行的是构造方法。若在构造方法中没有对其类中的成员变量进行初始化,则在构造方法执行完...下面通过一个小例子来说明这种情况
  • 关于基类和子类构造函数的问题 情况一:在一个类无自定义构造函数时,用这个类定义一个对象a,再定义另个一个对象b时,使用b(a)这种默认的拷贝构造函数时会出错,编译器提示a没有被定义。 如下面程序: #include ...
  • 在测试类中创建了Student对象,应该先执行的是父类的构造方法,然后在执行子类构造方法,但是执行父类构造方法的时候,为什么调用的是子类的f()方法。 然后把f()方法的public改成private的话,又是另一种结果...
  • 1.实例化父类时,可以通过new子类来实例化父类,执行构造函数的顺序为:先执行父类的构造函数,再执行子类构造函数。 2.实例化子类时,只可以new子类,执行顺序同上。 3.父类实例化后,只能执行父类的方法,获得...
  • 已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决,麻烦大家帮忙说明,关于构造,析构函数声明为私有和保护时的用法??? 提出这个问题,说明你已经对c++有所思考了。 从语法上来讲,一个函数被...
  • Python 子类继承父类构造函数说明

    千次阅读 多人点赞 2018-12-29 17:41:49
    (1) 如果在子类中需要的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。 子类不重写__init__,实例化子类时,会自动调用父类定义的__init__。 实例: class Father(object): def __init...
  • C++继承中关于子类构造函数

    千次阅读 2017-11-07 16:48:27
    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统...
  • 通常java的构造函数被设置为public的(若你不写构造函数,java自动添加的无参空构造函数就是public的),因本文中的类都在同一个包中,因此使用无修饰的友好权限说明问题,对于private构造函数的意
  • java子类调用父类构造函数

    万次阅读 多人点赞 2019-06-25 15:52:54
    java子类调用父类构造函数详解
  • C++子类构造函数后面加:冒号的作用

    万次阅读 多人点赞 2018-11-12 13:11:09
    在C++类的构造函数中经常会看到如下格式的写法: MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(parent,flag) ...调用格式为“子类构造函数 : 父类构造函数”,如下,其中QMainWin...
  • 1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。...继承中的构造方法的执行顺序:父类有构造函数子类也写构造方法的时候必须显示的调用父类的构造方
  • 父类与子类构造方法的执行顺序 最高级类 package com.hpe.demo2; //生物类 public class Creator { private int age; public Creator() { System.out.println("Creator的无参构造方法执行了"); } } ...
  • Python 继承之构造函数说明 在 Python 中,如果子类不重写 __init__,实例化子类时,就会自动调用父类的 __init__: class Father(object): def __init__(self, name): self.name=name print ( "name: %s" %( ...
  • Java 子类调用父类构造函数----super()详解

    万次阅读 多人点赞 2017-07-17 16:51:54
    Java 子类调用父类构造函数----super()详解
  • 子类能不能继承父类的构造函数

    千次阅读 2021-04-09 09:59:56
    一、子类能继承父类的构造函数? 答案是不能的。构造函数是创建对象时完成的初始化,当我们在new一个对象并传入参数时,会自动调用有参数的构造完成参数的初始化,也就是属性的初始化。试想子类中继承父类的构造...
  • C++中子类构造函数写法总结

    万次阅读 多人点赞 2015-04-25 17:09:00
    C++ 父类 子类 构造函数
  • 探讨这一块的内容,理论就不在叙述了,以例子进行说明: 代码: ngnsvr9 [** NONE **]/home/xionghailong/c++/boy $ ls boy.cpp boy.cpp.bak ngnsvr9 [** NONE **]/home/xionghailong/c++/boy $ cat boy.cpp #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,932
精华内容 54,372
关键字:

对于子类构造函数说明