Форум программистов, компьютерный форум CyberForum.ru

Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
06.06.2011, 18:57     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) #1
Сабж
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class otets {
 public:
  otets (){};
 private:
  int znach;
};
 
template <class T>
class sinn: public otets {
 public:
  sinn ():otets () {otets::znach= 9;}
};
 
int main() {
}
Это
C++
1
otets::znach= 9;
не должно компилиться. Но оно компилится. Почему?
Так, а закомментим //template <class T> и прога будет работать предсказуемо, ибо znach всё-таки закрытое поле тык скыть.
...template <class T> обладает какой-то магией и живёт своей жизнью!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2011, 18:57     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!)
Посмотрите здесь:

template <class T> C++
внук родительского класса не может работать с полями дедовского класса; почему? C++
C++ базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит!
Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier C++
C++ Template class
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
06.06.2011, 19:08     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) #2
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
// test.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class otets {
 public:
     otets (): znach(3) {};
 private:
  int znach;
};
 
template <class T>
class sinn: public otets {
 public:
     sinn (): otets () { 
         otets::znach= 9;
     }
};
 
int main() {
    sinn<int> i;
}
Добавлено через 41 секунду
шаблоны компилируются по особенному. Попробуй создать объект и он пошлёт тебя

Добавлено через 4 минуты

Не по теме:


вот так вот в обход интерфейса класса можно изменить приватное поле...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class otets {
 public:
     otets (): znach(3) {};
 private:
  int znach;
};
 
template <class T>
class sinn: public otets {
 public:
     sinn (): otets () { 
         int* i = reinterpret_cast<int*>(this);
         (*i)++;
     }
};
 
int main() {
    sinn<int> i;
}

kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
06.06.2011, 19:09  [ТС]     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) #3
Да уж... Действительно откровение. А как по особеному? Ну то есть я и по обыкновенному-то не знаю как. Знаю, что синтакис проверит. А тут какие-то неписанные синтаксические правила... Да так-то я protected могу написать...
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
06.06.2011, 19:15     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) #4
а что компилятору компилировать он ведь не знает до того момента, пока ты явно не создашь объект своего класса. В template<t> t может быть любым. Нет объекта - нечего компилировать. Это вкратце
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
06.06.2011, 19:23  [ТС]     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!) #5
Не, ну так-то можно было заметить и запретить обращение к приватному полю родительского класса БЕЗУСЛОВНО, без создания объектов. Хотя им там наверху виднее.
Yandex
Объявления
06.06.2011, 19:23     Почему сын может спокойно работать с полями privat отцовского класса (опять template <class T> воду мутит!)
Ответ Создать тему
Опции темы

Текущее время: 11:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru