class a
{
public:
int k;
int s(int n);
void s(char ch);
};
int a::s(int n)
{
return 0;
}
void a::s(char ch)
{
}
class b : public a
{
public:
int s(int n, char ch);
};
int b::s(int n, char ch)
{
k = 0;
return 0;
}
void main(void)
{
b u;
u.s(1);
u.k;
}
Объясните мне пожалуйста почему это не работает. Ведь class b это расширение class a. Ан нет не хотит!!!
Исправлена подсветка синтаксиса. -- ПК.
Здравствуйте, ms, Вы писали:
ms>class a
ms>{
ms>public:
ms> int k;
ms> int s(int n);
ms> void s(char ch);
ms>};
ms>int a::s(int n)
ms>{
ms> return 0;
ms>}
ms>void a::s(char ch)
ms>{
ms>}
ms>class b : public a
ms>{
ms>public:
using a::s; // добавить
ms> int s(int n, char ch);
ms>};
ms>int b::s(int n, char ch)
ms>{
ms> k = 0;
ms> return 0;
ms>}
ms>void main(void)
ms>{
ms> b u;
ms> u.s(1);
ms> u.k;
ms>}
ms>Объясните мне пожалуйста почему это не работает. Ведь class b это расширение class a. Ан нет не хотит!!!
Функции производного класса скрывают одноименные функции базового. Явление называется name hiding.
Здравствуйте, ms, Вы писали:
ms> u.s(1);
Надо
u.a::s(1);
Здравствуйте, ms, Вы писали:
ms>Объясните мне пожалуйста почему это не работает. Ведь class b это расширение class a. Ан нет не хотит!!!
потому что b::s скрывает обе функции s из класса a.
Здравствуйте, Bell, Вы писали:
Надо так:
class a
{
public:
int k;
int s(int n);
void s(char ch);
};
int a::s(int n)
{
return 0;
}
void a::s(char ch)
{
}
class b : public a
{
public:
using a::s;
int s(int n, char ch);
};
int b::s(int n, char ch)
{
k = 0;
return 0;
}
int main(void)
{
b u;
u.s(1);
u.s('c');
}
Спасибо ребята что откликнулись!
Но мне всё-равно почему-то кажется, что так всё-таки не правильно, надо было бы разрешить такой доступ, чтобы не было разночтения с теорией ООП!
Видать Страуструппу так удобнее!
Здравствуйте, ms, Вы писали:
ms>Но мне всё-равно почему-то кажется, что так всё-таки не правильно, надо было бы разрешить такой доступ, чтобы не было разночтения с теорией ООП!
"Теория ООП" вообще не затрагивает такие вопросы сугубо языкового уровня как правила именования и видимости имен.
ms> Видать Страуструппу так удобнее!
Нет, просто есть определенные унифицированные правила обращения с именами в разных пространствах видимости.