Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
7-1075127727
zamkom
2004-01-26 17:35
2004.04.04
Работа с СОМ портом


3-1078473254
Ann Boo
2004-03-05 10:54
2004.04.04
Применение функции locate для поиска записей по полю memo


6-1075058235
-=GaLaN=-
2004-01-25 22:17
2004.04.04
Список компьютеры в рабочей группе


14-1077691711
Kerk
2004-02-25 09:48
2004.04.04
Спартак - Мальерка 26 февраля


6-1074868075
Sound
2004-01-23 17:27
2004.04.04
Как очистить папку History?