Текущий архив: 2004.04.04;
Скачать: CL | DM;
Вниз
Чуть-чуть о наследовании... Найти похожие ветки
← →
Goida © (2004-03-05 09:42) [0]Есть программа:
type
TClassA = class
constructor Create;
destructor Destroy; override;
private:
procedure OutText; virtual;
end;
TClassB = class(TClassA)
constructor Create;
destructor Destroy; override;
private:
procedure OutText; virtual;
end;
constructor TClassA.Create;
begin
OutText
end;
destructor TClassA.Destroy;
begin
end;
procedure TClassA.OutText;
begin
//предположим
write("A")
end;
constructor TClassB.Create;
begin
OutText
end;
destructor TClassB.Destroy;
begin
end;
procedure TClassB.OutText;
begin
//предположим
write("B")
end;
var
ClB: TClassB;
begin
ClB := TClassB.Create; // <<< Создание объекты
...
end.
Что будет выведено на экран?
← →
Polevi © (2004-03-05 09:47) [1]B
← →
Reindeer Moss Eater © (2004-03-05 09:47) [2]Что будет выведено на экран?
Символы в виде светящихся пикселов
← →
TClassB (2004-03-05 09:47) [3]B
← →
Семен Сорокин © (2004-03-05 09:48) [4]"B"
← →
TClassB (2004-03-05 09:49) [5]
TClassB = class(TClassA)
// constructor Create;
// destructor Destroy; override;
private:
procedure OutText; override; //virtual;
end;
← →
jack128 © (2004-03-05 09:59) [6]Именно в таком написании
> TClassB = class(TClassA)
> constructor Create;
> destructor Destroy; override;
> private:
> procedure OutText; virtual;
> end;
Выведет "A"
если напишешь override - то "B" внимательно прочитай варнинги компилятора - там все написано...
← →
Внук © (2004-03-05 11:28) [7]>>jack128 © (05.03.04 09:59) [6]
Да нет, все равно выведет "B". Иначе пришлось бы думать - а не дай бог у предка есть одноименная виртуальная функция.
У Конопки это очень хорошо описано.
← →
jack128 © (2004-03-05 21:29) [8]
> Внук © (05.03.04 11:28) [7]
Не совсем. Моя ошибка в том, что я неучел переопределение конструктора с классе TClassB. Из-за этого действительно вывод будет B. Но виртуальный метод TClassA.OutText будет скрыт
например
var
cl: TClassA;
begin
// Insert user code here
cl := TClassB.Create; // Вывод "B"
cl.OutText; //вывод "А"
cl.Free;
ReadLn;
end. //А думать о том, есть ли у предка одноиименный виртуальный метод не надо - компилятор выдает предупреждения..
← →
Гаврила (2004-03-05 21:44) [9]Штрафовать надо :-) За такие вещи в коде релиза
Hint - $5
Warning - $10
← →
Внук © (2004-03-06 15:29) [10]>>jack128 © (05.03.04 21:29) [8]
>>Моя ошибка в том, что я неучел переопределение конструктора с классе TClassB
Нет, Ваша ошибка в том, что Вы не учли типа объявленной переменной var ClB: TClassB; Переопределение конструктора здесь не причем, можно и не переопределять.
>>А думать о том, есть ли у предка одноиименный виртуальный метод не надо - компилятор выдает предупреждения
То есть, чтобы решать, какую директиву мне здесь поставить, нужно пытаться откомпилировать программу? Хорошо, конечно, что у Borland компилятор быстрый, но, вообще говоря, нужно обходиться без этого, тем более что и задачи у этих директив разные. Вопрос для размышления: в чем разница между virtual и override? Ведь, к примеру, в C++ override нету :) Ответ на этот вопрос расставит все по местам.
>>Гаврила (05.03.04 21:44) [9]
Не факт :))
← →
jack128 © (2004-03-06 15:40) [11]
> Переопределение конструктора здесь не причем, можно и не
> переопределять.
если не переопределять (или написать
constructor TClassB.Create;
begin
inherited
// OutText
end;) то - выведет B - проверь ;-)
> в чем разница между virtual и override?
первое - объявляет НОВЫЙ виртуальный метод (и соответственно скрывает одноименный метод у предка)...
← →
jack128 © (2004-03-06 15:41) [12]
> то - выведет А - проверь ;-)
:-))
← →
Внук © (2004-03-06 18:24) [13]>>jack128 © (06.03.04 15:41) [12]
>> то - выведет А - проверь ;-)
Само собой. Потому что вызов данного метода идет из конструктора. Я говорил об общем случае (виноват, что недостаточно четко выразился :)). Тогда конструктор переопределять не обязательно.
>>первое - объявляет НОВЫЙ виртуальный метод
Поэтому если у меня нет намерения встраивать свой метод в цепочку вызовов, я с полным правом могу объявить одноименный виртуальный метод у своего класса и строить новую цепочку. Без оглядки на warnings. Тем более что при необходимости можно легко получить доступ и к скрытому методу.
Страницы: 1 вся ветка
Текущий архив: 2004.04.04;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.021 c