0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 4
1

Создание экземпляра класса-наследника для переменной с типом базового класса

18.04.2016, 16:09. Показов 2284. Ответов 7
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Подскажите чайнику как создается экземпляр класса  BC
BaseClass BC = new DerivedClass();
 
Вопрос: BC - это экземпляр класса BaseClass или DerivedClass   ?
 
class BaseClass
{
   public int A;
}
 
class DerivedClass : BaseClass
{
    public int B;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 16:09
Ответы с готовыми решениями:

Как сделать явное приведения переменной типа класса-наследника к типу базового класса?
Читал, что для этого нужно явное приведение к типу, но на практике выдаёт ошибку. Вот код: using...

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

Вызов переопределенного метода класса наследника из базового класса
Предположим есть два класа: public class A { /* ... некая...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы...

7
106 / 106 / 58
Регистрация: 04.03.2013
Сообщений: 479
18.04.2016, 16:13 2
alexanp, BC - это ссылочная переменная типа BaseClass которая указывает на экземпляр типа DerivedClass ( возможно благодаря тому что DerivedClass является подклассом BaseClass)
0
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 4
18.04.2016, 16:19  [ТС] 3
А этот экземпляр типа DerivedClass из чего состоит ?
В этот экземпляр входят оба поля A и B ?

Добавлено через 2 минуты
Как понять фразу "...переменная типа BaseClass которая указывает на экземпляр типа DerivedClass" ?
0
106 / 106 / 58
Регистрация: 04.03.2013
Сообщений: 479
18.04.2016, 16:29 4
alexanp,
Обратиться вы можете только к полю А, для обращения к полю B необходимо явно привести к типу подкласса
C#
1
2
DerivedClass bb = (DerivedClass) BC;
            Console.WriteLine(bb.B);
Цитата Сообщение от alexanp Посмотреть сообщение
Как понять фразу "...переменная типа BaseClass которая указывает на экземпляр типа DerivedClass" ?
переменная которая хранит адресс на обьект.. Её тип - BaseClass, обьект на который она указывает - типа DerivedClass
0
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 4
18.04.2016, 16:44  [ТС] 5
Т.е. все-таки этот экземпляр-объект содержит оба поля A и B. Так ?
Только почему-то с помощью ссылочной переменной BC, которая указывает на этот экземпляр-объект (содержащий A, B) НЕЛЬЗЯ обратиться к полю B. Т.е. объект содержит два поля A,B а у ссылочной переменной остались какие-то ограничения на доступ к полю B ?
0
Эксперт .NETАвтор FAQ
10337 / 5068 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.04.2016, 16:56 6
Цитата Сообщение от alexanp Посмотреть сообщение
Т.е. все-таки этот экземпляр-объект содержит оба поля A и B. Так ?
Только почему-то с помощью ссылочной переменной BC, которая указывает на этот экземпляр-объект (содержащий A, B) НЕЛЬЗЯ обратиться к полю B. Т.е. объект содержит два поля A,B а у ссылочной переменной остались какие-то ограничения на доступ к полю B ?
В принципе Serg22 вам все правильно и четко расписал.
Я немного дополню. Когда вы пишите new DerivedClass() то создается экземпляр типа DerivedClass. И этот тип никогда не меняется, какие бы дальнейшие преобразования вы не делали. Этот экземпляр содержит все поля DerivedClass - и поле A и поле B.
И ваша переменная BC будет указывать на экземпляр DerivedClass. Но у самой переменной тоже есть тип. Этот тип BaseClass. Зачем он нужен и на что влияет? Да почти ни на что не влияет. Ваш экземпляр все равно останется типа DerivedClass, даже если сама переменная будет типа object. Тип же переменной влияет только на то, какие методы/поля/свойства компилятор будет позволять вызывать у данной переменной. Поскольку ваша переменная типа BaseClass, то компилятор будет вам разрешать обращаться только к полю A. И в выпадающем списке полей будет видно только A.
Но вы в любой момент времени можете сделать преобразование к DerivedClass и обращаться к полю B. Например так: (BC as DerivedClass).B = ...;
1
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 4
18.04.2016, 16:59  [ТС] 7
Когда мы пишем "new DerivedClass()" мы создаем экземпляр-объект с двумя полями A, B.
А когда пишем "BaseClass BC" что происходит ?
И физически что такое "приведение типа" на данном примере ? Это какое-то "открытие" поля B для ссылочной переменной BC ?
0
Эксперт .NET
16665 / 12430 / 3267
Регистрация: 17.09.2011
Сообщений: 20,649
18.04.2016, 17:04 8
Цитата Сообщение от alexanp Посмотреть сообщение
А когда пишем "BaseClass BC" что происходит ?
Вы создаете переменную, которая может хранить ссылку на объект BaseClass или любой его наследник.

Цитата Сообщение от alexanp Посмотреть сообщение
И физически что такое "приведение типа" на данном примере ?
Создание новой переменной нужного вам типа из копии указанной переменной.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2016, 17:04
Помогаю со студенческими работами здесь

Создание экземпляра для наследника абстрактного класса
Есть абстрактный базовый класс: class Base { public: int variable; virtual void...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... ...

Создание базового класса и наследника
в данной программе , попросили добавить в void main ///camera obj//// и дописать в конструктор...

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1{...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru