Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51

Почему не работает?

24.06.2018, 20:50. Показов 1725. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
30
31
32
33
34
35
36
37
# include <iostream>
class Base{
public:
    Base(){
    std::cout<<"In constr"<<std::endl;
    }
    const char* eat;
    void eating(){
    eat="Apple";
    std::cout<<eat<<std::endl;
    }
 
};
 
class Derived:protected Base{
public:
    int Sp;
    Derived(){
    std::cout<<"In cinsttr"<<std::endl;
    }
        void Speed(){   
            Sp=35;
            std::cout<<Sp<<std::endl;
    }
 
 
};
 
int main(){
 
Base* pBase;
pBase=new Derived;//  error
 
 
system("pause");
return 0;
}
Когда public-наследвание ставлю - то все нормально или если тип указателя BASE поменяю на Derived, то тоже все норм.
Но почему так, почему когда у меня public, то все работает, ведь констр-р BASE вызывается не из main(), а из Drived, поэтому ему должно быть все равно на то, что тут защищенное наследование, главное чтобы Derived констр-р был доступен.

Или если поменять тип на Derived указателя, при этом оставляя защищенное наследование, то тоже норм компилится, объясните?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2018, 20:50
Ответы с готовыми решениями:

Почему смена текста работает только один раз? Что неправильно в коде и почему?
Нужно чтобы при щелчке мыши на поверхности кнопки текст метки Label изменялся на текст окна редактора текста (TextBox). partial class...

Почему выводится в виде таблицы и почему не работает сортировка
почему выводится в виде таблицы? почему не работает сортировка? и как туда можно вставить классы комнат? hotel.h #include...

Не работает изменение, не могу понять почему, Update не работает, ошибку выдает
Помогите, изменение с помощью button string u = заявкиDataGridView.CurrentRow.Cells.Value.ToString(); ...

27
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2018, 16:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _stanislav Посмотреть сообщение
class A {};
class B: protected A {};
int main()
{
* * A* p = reinterpret_cast<A*>(&B() );
}
reinterpret_cast - спички детям не игрушка.
развалится при множественном наследовании.

http://rextester.com/JMVC42751


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
 
 
 
class A 
{
    public: A(){}
    virtual ~A(){}
    
    void work() 
    {
        std::cout << "A::work beg" << std::endl;
        for(auto& el: arr)
            el = 1;
        std::cout << "A::work end" << std::endl;
    }
    char arr[255];
};
 
class B
{
    public: B(){}
    virtual ~B(){}
    
    void work() 
    {
        std::cout << "B::work beg" << std::endl;
        for(auto& el: arr)
            el = 1;
        std::cout << "B::work end" << std::endl;
    }
    
    int arr[255];
};
 
// при множественном наследовании
class C: protected B, protected A
{
    public: 
    C()
    {
        // --- мы видим, что адреса подобъектов разные
        // --- адреса B* и A* выполнены с некоторым смещением
        // --- это вполне закономерно
        // --- ведь класс С должен вместить в себя и A и B
        // --- и они не должны накладываться друг на друга.
        
        // --- в обычной жизни, компилятор зная о множественном наследовании
        // --- самостоятельно выполнит корректировку адреса
 
        A* a = this;
        B* b = this;
        C* c = this;
        
        std::cout <<"address A: " << a << std::endl;
        std::cout <<"address B: " << b << std::endl;
        std::cout <<"address С: " << c << std::endl;
    }
    virtual ~C(){}
};
 
 
 
void foo(A& a)
{
    std::cout <<"my real address: " << &a << std::endl;
    
    a.work();
}
 
int main()
{
    C c;
    
    // однако, reinterpret_cast не учитывает возможные смещения
    A& a = reinterpret_cast<A&>(c);
    
    // на примере мы видим,
    // что адрес C совпадает с B
    // а вовсе не с А
    // таким образом получаем невалидную ссылку
    foo(a);
}

address A: 0x7ffc13df6178
address B: 0x7ffc13df5d70
address С: 0x7ffc13df5d70
my real address: 0x7ffc13df5d70
A::work beg
A::work end
мы видим: компилятор запускает методы думая что это класс A.
а на самом деле по этому адресу располагается класс B
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.06.2018, 16:47
Цитата Сообщение от hoggy Посмотреть сообщение
развалится при множественном наследовании.
значит это единственная причина почему запрещается приведение типа при protected наследовании или еще есть причины?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2018, 17:01
Почитал стандарт, я был неправ.
Можно написать вот так даже при protected-наследовании и будет работать.

C++
1
pBase = (Base*)new Derived;
A member of a private base class might be inaccessible as an inherited member name, but accessible
directly. Because of the rules on pointer conversions (7.11) and explicit casts (8.4) , a conversion from a
pointer to a derived class to a pointer to an inaccessible base class might be ill-formed if an implicit conversion
is used, but well-formed if an explicit cast is used. For example,


18-19 строки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class B {
public:
int mi; // non-static member
static int si; // static member
};
class D : private B {
};
class DD : public D {
void f() ;
};
void DD:: f() {
mi = 3; // error: mi is private in D
si = 3; // error: si is private in D
:: B b;
b. mi = 3; // OK (b. mi is different from this->mi)
b. si = 3; // OK (b. si is different from this->si)
:: B: : si = 3; // OK
:: B* bp1 = this; // error: B is a private base class
:: B* bp2 = (:: B*) this; // OK with cast
bp2->mi = 3; // OK: access through a pointer to B.
}
1
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
25.06.2018, 17:04
Цитата Сообщение от _stanislav Посмотреть сообщение
мне не понятно почему нельзя срезать объект при protected наследовании если срезка объекта к базовому классу безопасна.
Просто при protected или private наследовании объект производного класса не является объектом базового класса, как при public наследовании, а следовательно привести указатель или ссылку на производный класс к указателю или ссылке соответственно на базовый класс нельзя.

Почему так происходит очень даже легко. Как минимум все члены этого производного класса уже будут protected, если вообще не private или вообще не доступны при наследовании, которое не public. Поэтому, ни о какой срезке тут говорить не приходится, поскольку, чтобы Вы не срезали, все равно ничего public там уже просто нет.
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2018, 17:39
C++
1
pBase = (Base*)new Derived;
Хотя, что касается этой строки, то оно как оказалось может конвертировать вообще как угодно, даже два класса, не связанные наследованием...
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
28.06.2018, 22:32  [ТС]
Понятно, спасибо огромное, я тут рассудил, ведь если мы переведем из der в bas, то нам, по идее, должны быть доступны из main() члены класса base, но через объект der, а они не доступны, поэтому комилятор защищает меня от этого, верно?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
28.06.2018, 22:38
prado777, ну, я про это и писал. Если сделаете public-наследование с protected-спецификатором для определенного набора данных и методов в базовом классе, то проблемы этой не будет.
1
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
28.06.2018, 23:42  [ТС]
Down-cast: объяснить нюансы нисходящего преобразования типов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2018, 23:42

Ноутбук работает только с Wi Fi роутера дома, в кафе не работает и везде. Почему?
Подскажите пожалуйста, почему у меня ноутбук с виндой 7, работает вай фай только дома с роутера. А когда я прихожу в кафе или в парк, у...

Почему один и тот-же код в WindowsForms работает, а в Web не работает?
Здравствуйте, подскажите почему один и тот-же код в WindowsForms работает, а в Web не работает. Код WindowsForms: namespace...

Не работает удаление пробелов в строке! Подскажите пожалуйста, почему не работает?
Здравствуйте! Скажите пожалуйста, почему не работает данный код; должно брать строку, которую ввёл пользователь, удалять из неё все...

Почему в iPhone не работает нажатие на телефонный номер, а в Android работает?
Здравствуйте! Почему если открыть на iPhone WEB сайт, на котором отображают телефонный номер для связи и нажать на него то ничего не...

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru