Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
1

Ссылка базового класса на объект производного класса

22.05.2013, 05:11. Просмотров 2720. Ответов 5
Метки нет (Все метки)

Граждане, объясните почему такое происходит. До того как проверил, думал, что если для ссылки базового класса запустить конструктор производного, то в такой ситуации объект "урежется" до базового класса (например останутся только поля базового, но заполненные из производного)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    class Program
    {
        static void Main()
        {
            Parent A = new Child();
            Console.WriteLine(A.GetType());            
        }
    }
 
    class Parent
    {
        public Parent()
        {
            Console.WriteLine();
            Console.WriteLine("Конструктор Parent запустился "+ A);
        }
 
        public int A = 1;
    }
 
    class Child:Parent
    {
        public Child()
        {
            Console.WriteLine("Конструктор Child запустился " + B);          
        }
 
        public int B = 2;
    }
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 05:11
Ответы с готовыми решениями:

Обращение к полю производного класса по ссылке базового класса
Описывается базовый и производный класс. В методе Main создается объект производного класса и...

Вызвать метод производного класса из базового класса
namespace patterns { public class BaseClass { public virtual void Action() ...

Создать конструктор производного и базового класса с переменными
Помогите доделать задание, нужно создать конструктор производного и базового класса с переменными и...

Несколько объектов (как базового, так и производного класса) сохранить в один массив
Есть такое задание на С#, помогите выполнить т.к. сам не понимаю вообще в этом ничего. Если можно...

Ссылка объекта а, класса с, на объект b ,класса с
Мне нужно что бы в классе с был метод е, который брал из объекта а переменную р и отнимал от нее...

5
Psilon
Master of Orion
Эксперт .NET
6041 / 4899 / 903
Регистрация: 10.07.2011
Сообщений: 14,515
Записей в блоге: 5
Завершенные тесты: 4
22.05.2013, 09:27 2
Это называется полиморфизм. Конструкторы виртуальные, насколько я помню. Значит всегда вызывается конструктор самого типа (который под new), а не того, какого типа ссылка.
0
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
22.05.2013, 15:41  [ТС] 3
Цитата Сообщение от Psilon Посмотреть сообщение
Конструкторы виртуальные, насколько я помню
В смысле? Почему? Неявно они виртуальные?

Цитата Сообщение от Psilon Посмотреть сообщение
Значит всегда вызывается конструктор самого типа (который под new), а не того, какого типа ссылка.
Нет, это понятно, программист волен вызвать вообще любой конструктор для ссылки. Вопрос в том, что из себя будет представлять объект по этой ссылке. Ведь в приведенном коде получается, что он формально считается классом Child, хотя по факту он Parent, ведь мы не можем обратиться например к полям Child. Как такое понимать?
0
Psilon
Master of Orion
Эксперт .NET
6041 / 4899 / 903
Регистрация: 10.07.2011
Сообщений: 14,515
Записей в блоге: 5
Завершенные тесты: 4
22.05.2013, 17:29 4
Void-87, наоборот, это по факту Child, но мы формально считаем его Parent.
0
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
22.05.2013, 18:06  [ТС] 5
Цитата Сообщение от Psilon Посмотреть сообщение
Void-87, наоборот, это по факту Child, но мы формально считаем его Parent.
Но тем не менее ведь поля и методы Child'а ведь для него недоступны. Технически он тоже Child? Ну то есть памяти выделено как для Child?
0
Psilon
Master of Orion
Эксперт .NET
6041 / 4899 / 903
Регистрация: 10.07.2011
Сообщений: 14,515
Записей в блоге: 5
Завершенные тесты: 4
22.05.2013, 18:13 6
Void-87,
Но тем не менее ведь поля и методы Child'а ведь для него недоступны.
Потому что среда не знает, что на самом деле по адресу лежит Child.
Технически он тоже Child? Ну то есть памяти выделено как для Child?
Что значит "как"? Есть операция
C#
1
new Child();
в этом месте среда создает объект этого типа. А куда вы там его присвоите и присвоите ли в принципе - ваше дело.

С тем же успехом можно написать
C#
1
object obj = new Child();
тогда вообще никаких методов у obj не будет. Но тем не менее он продолжает ссылаться на Child
C#
1
Child child = (Child) obj;
0
22.05.2013, 18:13
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2013, 18:13

Порядок записи полей базового и производного классов, почему сначала производного а потом базового, ведь должно быть наоборот ?
Есть простой пример. Получаю с помощью рефлексии поля двух классов, базового и производного. Почему...

Объект базового класса вернуть как get set
Дан базовый класс А, от него унаследован производный класс B, и в нем определен объект класса А,...

Как из метода производного класса вызвать поле родительского класса
Добрый день! Помогите пожалуйста вызвать поле базового класса из метода производного класса. Код,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.