Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Наследование private-членов

26.09.2018, 12:05. Просмотров 4489. Ответов 20
Метки нет (Все метки)

private-члены класса не наследуются или наследуются, но доступ к ним запрещен из класса потомка и вообще из вне класса, в котором они определены?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2018, 12:05
Ответы с готовыми решениями:

Наследование приватных членов
Стыдно задавать такой вопрос, но все же. В производном классе наследуются члены, обозначенные как...

Наследование private
Почему в следующем коде экземпляр класса man вернет 'Hello'? Должен же запретить наследование...

Private наследование
Добрый вечер, почему приходится подставлять явно ссылку на базовый класс - компилятор скушал -...

Наследование, доступ к private
Есть два класса Passport и ForeignPassport В одном содержится переменная в private которую нельзя...

20
602 / 557 / 163
Регистрация: 17.07.2012
Сообщений: 1,590
Записей в блоге: 1
26.09.2018, 12:10 2
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Соколиный глаз, наследуются. Доступ запрещен из вне.
1
1405 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,321
Записей в блоге: 1
26.09.2018, 12:11 3
Доступ запрещен, но наследуются.
1
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 12:14 4
Товарищи, а вы знали, что статические члены в C# тоже наследуются? Я об этом узнал только из JavaScript, когда повторил то же самое в C# )))))
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
26.09.2018, 12:15  [ТС] 5
amr-now, оо как. Удивил.
0
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 12:18 6
Соколиный глаз, непосредственно нестатическую часть объекта, то есть экземпляр, можно представить в виде слоёного торта У основания будет самый первый предок, потом пойдут выше слои потомков. Скрытость не означает отсутствие. Каждый следующий потомок добавляет свой слой.

Добавлено через 37 секунд
Соколиный глаз, сам в шоке.
В Java же насколько помню, именно статическая часть не наследуется.

Добавлено через 1 минуту
Соколиный глаз, так что и Вам рекомендую постоянно сравнивать C# c JavaScript.
Откроется много интересных параллелей, которые были скрыты.
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
26.09.2018, 12:19  [ТС] 7
В C# понятно, рефлексией проверить можно, а в Java? Не по теме немного, но ради интереса как Вы это про Java узнали?

Добавлено через 35 секунд
Цитата Сообщение от amr-now Посмотреть сообщение
Соколиный глаз, так что и Вам рекомендую постоянно сравнивать C# c JavaScript.
Откроется много интересных параллелей, которые были скрыты.
Спасибо за совет.
0
Эксперт .NET
14673 / 11091 / 2914
Регистрация: 17.09.2011
Сообщений: 18,614
26.09.2018, 12:24 8
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от amr-now Посмотреть сообщение
Товарищи, а вы знали, что статические члены в C# тоже наследуются?
Не совсем наследуются, просто доступ к членам, объявленным в родительском классе, доступен из дочерних классов или через имя дочернего класса.
Но по факту это член, объявленный в родительском классе — при наследовании он не дублируется:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class Foo
{
    public static int X;
}
class Bar : Foo
{
 
}
 
Foo.X = 10;
Bar.X = 20; // Здесь студия даже предложит, что по-хорошему надо бы X получать через Foo.
Console.WriteLine(Foo.X); // 20
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
26.09.2018, 12:30  [ТС] 9
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
namespace ConsoleApp1
{
    class T1
    {
        public static readonly int x = 2;
    }
 
    class T2 : T1
    {
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            T2 a = new T2();
            Console.WriteLine(T2.x); // Здесь при компиляции автоматически T2 заменится на T1?
        }
    }
}
0
Эксперт .NET
14673 / 11091 / 2914
Регистрация: 17.09.2011
Сообщений: 18,614
26.09.2018, 12:33 10
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Здесь при компиляции автоматически T2 заменится на T1?
Да.
1
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
26.09.2018, 12:34  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
при наследовании он не дублируется
Вы хотите сказать, что наследование = дублирование? Я думал, что если искомый член x есть только в родительском классе, а получаем к нему доступ из потомка-класса, то ищется x среди определенных классом-потомков членов, потом среди всех, которые у класса-родителя.
0
Эксперт .NET
14673 / 11091 / 2914
Регистрация: 17.09.2011
Сообщений: 18,614
26.09.2018, 12:42 12
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Вы хотите сказать, что наследование = дублирование?
Нет, наследование — это дополнение и расширение, хотя его весьма сложно применить к статическим членам.
Я просто рассуждаю в рамках расположения типов в памяти.
Если класс Б наследуется от класса А и в классе А есть статический член Х, который имеется в одном экземпляре на весь тип, то при создании нового типа Б у него не будет "своего" статического члена Х: будь то поле или метод.
Не знаю, можно ли называть возможность доступа из одного типа к переменной другого типа наследованием.
1
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 12:45 13
Соколиный глаз, физически ищет только в виртуальных методах. В невиртуальных методах идет прямая ссылка, поэтому невиртуальный метод вызывается быстрее.
0
Эксперт .NET
14673 / 11091 / 2914
Регистрация: 17.09.2011
Сообщений: 18,614
26.09.2018, 12:48 14
Цитата Сообщение от amr-now Посмотреть сообщение
поэтому невиртуальный метод вызывается быстрее.
Но по факту практически все вызовы (за исключением некоторых сценариев) производятся через тот же callvirt.
По крайней мере в майкрософтовском компиляторе.
0
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 13:10 15
kolorotur, интересно девки пляшут.
VS2017 решил прямо указать:"Class2.a" скрывает наследуемый член "Class1.a". Укажите new
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
using System;
 
namespace Question12924631
{
    class Class1
    {
        public static int a = 1;
        public static void Method()
        {
            Console.WriteLine();
        }
    }
    class Class2 : Class1
    {
        new public static int a = 2;
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadKey();
        }
    }
}
Походу решили переиграть отношение к наследованию статических членов.

Добавлено через 4 минуты
А ведь я раньше твёрдо помнил, что наследования статических методов не было )))

Добавлено через 4 минуты
Радует, что статический метод до сих пор не может быть помечен virtual, override или abstract.
То есть полиморфизма у статических методов всё равно нет.

Добавлено через 3 минуты
То есть выведет всё равно 1:
C#
1
Class2.Method();
0
Модератор
8604 / 5934 / 1690
Регистрация: 21.04.2018
Сообщений: 17,645
Записей в блоге: 2
26.09.2018, 13:43 16
Цитата Сообщение от amr-now Посмотреть сообщение
То есть выведет всё равно 1:
У Вас Method(), по моему, выведет только пустую строку.
0
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 13:46 17
Цитата Сообщение от kolorotur Посмотреть сообщение
практически все вызовы (за исключением некоторых сценариев) производятся через тот же callvirt.
Насколько понимаю, этот callvirt используется для явного указания this. Но непосредственно машинные инструкции могут быть любыми, не обязательно ищя методы по цепочке методов.

Добавлено через 46 секунд
Элд Хасп, да. Там я просто выводил а.
0
Модератор
8604 / 5934 / 1690
Регистрация: 21.04.2018
Сообщений: 17,645
Записей в блоге: 2
26.09.2018, 13:54 18
Цитата Сообщение от amr-now Посмотреть сообщение
Там я просто выводил а
Ну, тогда это естественно. Методы базового класса не имеют информации о производных классах. Это в принципе не возможно. При желании его можно переопределить в производном классе и тогда он будет выводить 2.
0
Эксперт JS
5075 / 2911 / 1366
Регистрация: 14.06.2018
Сообщений: 5,565
26.09.2018, 14:02 19
Элд Хасп, статический метод не может быть виртуальным, то есть полиморфизма статических методов нет. Это важно.

Добавлено через 2 минуты
Причем статический метод вызывается с помощью call, а нестатический метод вызывается с помощью callvirt, как напомнил kolorotur.
Статическому методу this не нужен.
0
602 / 557 / 163
Регистрация: 17.07.2012
Сообщений: 1,590
Записей в блоге: 1
26.09.2018, 15:04 20
Цитата Сообщение от amr-now Посмотреть сообщение
Насколько понимаю, этот callvirt используется для явного указания this. Но непосредственно машинные инструкции могут быть любыми, не обязательно ищя методы по цепочке методов.
callvirt используется для проверки на null вызывающего экземпляра, не более того. Есть очень наглядный пример на эту тему:
C#
1
2
3
4
new MyClass().MyMethod() //здесь будет call
 
var myObj = new MyClass();
myObj.MyMethod(); //здесь будет callvirt
Как такового поиска нужного метода выполнения в рантайме нет. В таблице методов уже будет нужный адрес метода нужного типа.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2018, 15:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

private наследование enum
class Pixel1 { public: enum Color { black, blue, green, red = 4, yellow = 14, white = 15 }...

А где вы используете private наследование?
Private наследование позволяет реализовать отношение содержит, т.е. почти то же, что и встроить...

А где вы используете private наследование?
Насколько я знаю то при приватном наследовании наследник ничего от родительского класса не...

Наследование со спецификатором доступа private
Вопрос состоит в следующем. Если базовый класс наследуется со спецификатором доступа private,...


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

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

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