- •Void Putdec(int d);
- •Int Numberdec();
- •Int dec;
- •Void Init (int m,int s);
- •1. В базовом и производном классе нет конструкторов.
- •2. В базовом классе создан конструктор без параметров, в производном конструктор отсутствует.
- •3. В базовом классе конструктор отсутстивует, в производном создан без параметров
- •4. В базовом и производном классах есть конструкторы без параметров.
- •5. В базовом есть конструктор без параметров, в производном с параметрами.
- •6. Если в базовом классе есть конструктор с параметрами, в производном классе должен быть с параметрами и базовый конструктор должен быть явно вызван.
- •Icalculate.Cs
Void Init (int m,int s);
protected:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
class Sprint : public Record
{
public:
void Init(int m,int s, int d);
private:
int dec;
};
// перегрузка
void Sprint::Init(int m,int s, int d)
{
min=m;
sec=s;
dec=d;
}
int main(int argc, char* argv[])
{
int m,n;
Record x;
x.Init(4,36); // min=4 sec=36
Sprint z;
z.Init(1,8,6); // min=1 sec=8 dec=6
}
Init(int m,int s,int d) в Sprint перекрывает наследуемый метод Init(int m,int s) в Record, не работает:
int main(int argc, char* argv[])
{
Sprintz;
z.Init(1,8); // неправильное число аргументов
.........
Для вызова метода другого класса явно указывается принадлежность этому классу.
z.Record::Init(5,8); // min=5 sec=8 dec не определено
Вариант Init класса Sprint с вызовом Init базового класса.
void Sprint::Init(int m,int s, int d)
{
Record::Init(m,s); // вызов метода из другого класса
dec=d;
}
Возможна перегрузка метода в производном классе с такими же параметрами как в базовом классе.
Добавлен метод:
void Sprint::Init(int m,int s)
{
min=m;
sec=s;
dec=1;
}
int main(int argc, char* argv[])
{
Sprint z;
z.Init(1,8,6); // min=1 sec=8 dec=6
z.Init(1,8);// вызов второго метода
Перегрузка методов базового класса в java
class Record
{
protected int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
}
class Sprint extends Record
{
private int dec;
public void Init(int m,int s,int d)
{
min=m;
sec=s;
dec=d;
}
}
public class WorkSport
{
public static void main (String args[] )
{
int p;
Record a=new Record();
a.Init(2, 40);
p=a.Numbersec();
System.out.printf("%d\n ", p);
Sprint b=new Sprint();
b.Init(1, 10,5);
p=b.Numberdec();
System.out.printf("%d\n ", p);
}
}
В java перегруженный метод Init(int m,int s,int d) в Sprint не перекрывает наследуемый метод Init(int m,int s) из Record
Sprint b=new Sprint();
b.Init(1, 10,5);
Sprint c=new Sprint();
c.Init(2, 15); // вызов наследуемой функции из Record с двумя аргументами
Вариант Init класса Sprint с вызовом наследуемого метода из Record
public void Init(int m,int s,int d)
{
super.Init(m,s); // вызов метода базового класса (аналог Record::Init(m,s) на C++
dec=d;
}
Если в Sprint нет перегруженного метода из Record Init(int m,int s) с двумя аргументами в Java можно записать Init(m,s); без super. Понятно, где брать Init с двумя аргументами.
Перегрузка методов базового класса в c#
classSprint:Record
{
private int dec;
..................................
public void Init(int m, int s, int d) // перегрузка
{
min = m;
sec = s;
dec = d;
}
static void Main(string[] args)
{
Record a=new Record();
Sprint b=new Sprint();
Sprint c = new Sprint();
int m, k;
a.Init(5, 6);
b.Init(5, 6,9);// вызов перегруженного метода
c.Init(5, 6);// вызов наследуемого метода (нет перекрытия как на C++)
с.Putdec(8);
..................................
Возможна перегрузка метода с теми же аргументами, как и в базовом классе.
class Sprint : Record
{
private int dec;
public void Putdec(int d)
{
dec=d;
}
public void Init(int m, int s, int d)
{
min = m;
sec = s;
dec = d;
}
public void Init(int m, int s, int d) // вариант с вызовом базового класса
{
base.Init(m, s);
dec = d;
}
public void Init(int m, int s) // перегрузка базового с теми же аргументами
{
min = m;
sec = s;
dec = 1;
}
static void Main(string[] args)
{
Record a=new Record();
Sprint b=new Sprint();
Sprint c = new Sprint();
int m, k;
a.Init(5, 6);
b.Init(5, 6);// вызов перегруженного метода dec=1
c.Init(5, 6, 8);
b.Putdec(8);
11) Конструкторы в производных классах
Конструкторы не наследуются. Правила работы с конструкторами производного класса.
Если в базовом классе есть конструктор без параметров, при создании объектов производного класса сначала вызывается конструктор базового класса, затем производного. При вызове деструктора объекта производного класса сначала вызывается деструктор производного класса, затем базового.
Варианты конструкторов базового и производного классов