继承中的构造函数问题
代码如下:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Teacher t1 = new Teacher("许大虾", 23, "byvar1024@163.com", 10000); 6 Student s1 = new Student("许大虾", 23, "byvar1024@163.com", "100001"); 7 } 8 9 } 10 class Person//基类 11 { 12 13 public Person(string name,int age,string email) 14 { 15 16 this.Name = name; 17 this.Age = age; 18 this.Email = email; 19 } 20 public string Name { get; set; } 21 public int Age { get; set; } 22 public string Email { get; set; } 23 } 24 class Teacher : Person //派生类 25 {28 public Teacher(string name, int age, string email,double salary) 29 { 30 this.Name = name; 31 this.Age = age; 32 this.Email = email; 33 this.Salary = salary; 34 } 35 public double Salary { get; set; } 36 } 37 class Student : Person//派生类 38 { 39 public Student(string name, int age, string email,string sno) 40 { 41 this.Name = name; 42 this.Age = age; 43 this.Email = email; 44 this.SNo = sno; 45 } 46 public string SNo { get; set; } 47 }
创建了Person父类,再让Student[子类]和Teacher[子类]继承Person类,同时分别在两个子类中各自添加一个构造函数。这时在父类也添加一个有参数的构造函数。编译生成后,发现产生了如下错误:
问题分析:
1.构造函数无法被继承
2.由于在创建子类对象的时候,一定会调用子类的构造函数,而任何一个子类构造函数默认情况下都会去调用父类的无参构造函数,所以当父类中没有无参构造函数时就出错了。
解决方法:
a.在父类中增加一个无参构造函数
b.在子类中指定子类的构造函数调用父类中没有参数的那个构造函数
代码变更:
a方案,直接在Person类添加一个无参构造函数
Public Person(){}
b方案,在子类中通过base()来指定调用父类[Person]的构造函数
class Teacher : Person{public Teacher(string name, int age, string email,double salary):base(name,age,email){//this.Name = name;//this.Age = age;//this.Email = email;this.Salary = salary;}public double Salary { get; set; }}
这里你会发现我把以下代码给注释掉了,原因是刚已经通过base()来手动调用父类的构造函数,而在父类中已经把这三个属性赋值了,所以就没必要再写一遍了
//this.Name = name;//this.Age = age; //this.Email = email;
这里需要注意的执行顺序是先调用父类的构造函数,然后再执行子类自己的构造函数
转载于:https://www.cnblogs.com/byvar/p/4301284.html
继承中的构造函数问题相关推荐
- C++:继承中的构造函数和析构函数
C++:继承中的构造函数和析构函数 1.继承中构造函数和析构函数调用顺序 a.调用父类构造函数: b.调用其他成员的构造函数: c.调用子类构造函数: d.析构调用顺序相反. #include < ...
- 7-15 单继承中的构造函数与析构函数 (10 分)
7-15 单继承中的构造函数与析构函数 (10 分 编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一 ...
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...
- 类继承中的构造函数与析构函数
构造函数初始化列表 子类的初始化列表,只能对子类的成员变量进行初始化 class Base{ public:int x; };class Derived : public Base { public: ...
- 多继承中的构造函数的顺序
(1)任何虚拟基类的构造函数按照它们被继承的顺序构造. (2)任何非虚拟基类的构造函数按照它们被构造的顺序构造. (3)任何成员对象的构造按照它们声明的顺序调用. (4)类自身的构造函数.
- 单继承中的构造函数与析构函数
编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...
- PTA:单继承中的构造函数与析构函数(c++,继承)
编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...
- c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)
继承中的构造函数和析构函数 继承中的构造和析构顺序 子类创建对象时,先调用父类的构造,然后调用自身构造 析构顺序与构造顺序相反 子类不会继承父类的构造函数和析构函数 如果父类中没有合适默认构造,那么子 ...
- C++学习笔记day47-----C++98-继承中的构造函数,析构函数,拷贝构造函数,拷贝赋值函数,多重继承,虚继承
继承中的构造函数 当通过一个子类创建一个新的对象时,编译器会根据子类在初始化表中指明的基类的初始化方式去调用基类相应的构造函数.如果子类的初始化表中,并没有指明基类的初始化方式,编译器将会调用基类的无 ...
最新文章
- R语言axis函数自定义可视化的坐标轴刻度线(axis ticks)
- Spring Cloud Alibaba 系统保护 - 限流与熔断:Sentinel 在项目中的最佳实践
- React中如何优雅的捕捉事件错误
- 前端文章精选- 收藏集 - 掘金
- 2021年春季学期-信号与系统-第三次作业参考答案-第六道题
- CompletableFuture CompletableFuture.supplyAsync 异常处理
- [JavaScript]关于div的隐藏
- 初等数论--整除--欧几里得算法/辗转相除法/更相减损术
- 《30天自制操作系统》前言、目录、样章欢迎阅读!
- 《图解服务器网络架构》 学习笔记
- linux 神的编辑器,编辑器之神-vim的使用,编辑器神-vim
- Python笔记-类的单例模式及重载打印
- RDS 设置 group_concat的长度限制 1024 改为 102400
- 关于ionic打包出错:ionic Unable to start the daemon process
- 【实例解析】某集团BI决策系统建设方案分享
- Linux常用命令(持续更新)
- 难道是我洞悉了CSDN网站订阅专栏收益的秘密?带你看看网站专栏一天营收几何?
- 【OpenCV4 官方文档】机器学习概述
- 茗创:近红外数据处理业务
- Linux socket跨局域网聊天和文件传输