继承中的的构造函数问题

代码如下:

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Teacher t1 = new Teacher("许大虾", 23, "[email protected]", 10000);
 6             Student s1 = new Student("许大虾", 23, "[email protected]", "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;

这里需要注意的执行顺序是先调用父类的构造函数,然后再执行子类自己的构造函数

时间: 2024-11-01 10:20:09

继承中的的构造函数问题的相关文章

C++中继承中遇到的构造函数问题

今天在开发时遇到了一个之前一直以为理所当然的构造函数问题. 先给总结: 子类在构造时,如果没有显式调用父类的构造函数,会先调用父类的默认构造函数(无参数的) 下面给出不同情况的例子 例子一:父类有默认的构造函数,子类的构造函数随便 #include <iostream> class Base{ public: Base(){ } }; class Derive:public Base{ public: Derive(int a,int b){ } }; int main(){ Derive c

C++继承中关于子类构造函数的写法

转载于:http://www.cnblogs.com/kaige/p/cplusplus_virtual_inheritance_derived_class_constructor.html 构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法. 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没

多重继承,虚继承,MI继承中虚继承中构造函数的调用情况

先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: [cpp] view plain copy print? //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base()

派生类的构造函数和析构函数和多继承中的二义性与虚函数

析构函数主要作用是对数据成员初始化. 1派生类的构造函数 派生类的构造函数定义的一般形式为: 派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1 参数表),基类2(基类2 参数表),···,基类n(基类n 参数表),对象成员1(对象1 参数表),对象成员2(对象2 参数表),···,对象成员m(对象m 参数表){ //本类基本类型数据成员初始化 } 如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数.此时,系统会调用基类的默认构造函数.如果使用对象数

(C++)C++类继承中的构造函数和析构函数

思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream> using namespace std; class Shape{ public: void Draw() {cout<<"Base::Draw()"<<endl;} void Erase() {cout<<"Base::Erase()

继承中的构造函数

构造函数的作用:初始化对象, 继承的两个特性:单根性,和传递性. 一:一个类中可以存在多个构造函数,他们实现一个重载关系.构造函数之间会造成冗余的情况. 列如: 解决办法就是用this来解决冗余问题. this 有两个作用:1.表示当前类的对象.2.解决本类中出现的冗余问题. 二:继承中构造函数. 继承:即子类(派生类)继承父类(基类)的属性和方法,在这个过程中发生的过程: 1.为子类实例化对象时,系统会默认为父类实例化对象,(默认调用的是空构造函数)调用父类的属性和方法,然后才实例化子类对象.

C++继承中析构函数 构造函数的调用顺序以及虚析构函数

首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,仅仅有这样子类才干在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数.通俗点说,你要用某些物品.但这些物品你没办法自己生产,自然就要等别人生产出来,你才干拿来用. 接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会仅仅存在子类中直到子类调

C++多重继承,菱形继承中构造函数的调用顺序

C++中多重继承不免会出现钻石继承,也就是继承类的两个基类同时又是同一个基类的继承类,当创建一个对象的时候,他们是按照什么样的顺序调用构造函数的呢. 如果不进行虚拟继承: class Base { public: Base() { cout<<"Base默认构造函数调用"<<endl; } Base(int i) { cout<<"Base参数构造函数调用"<<endl; cout<<i<<en

OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致: 1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 // A(); 7 // ~A(); 8 ostream& print(ost