Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2012, 19:11   #1
Theseus
Пользователь
 
Аватар для Theseus
 
Регистрация: 11.02.2009
Сообщений: 29
По умолчанию Наследование в С++

Здравствуйте! Учу С++ потихоньку и столкнулся с такой проблемой: при попытке доступа к функции класса родителя из класса потомка компилятор выдаёт ошибку, что он недоступен. Помогите разобраться в чём проблема.
Вот объявление родительского класса:
Код:
class neko
{
	private:
		char * name;
		int tail;
		float hairy;
		double weight;
	public:
		neko();
		neko(const char * o_namae, int o_tail, float o_hairy, double o_weight);
		~neko();
		void o_namae_wa(const char * o_namae);
		void axe(int k);
		void comb(float k);
		void weigh(double k);
		void show_neko() const;
};
А вот класс который его наследует и с которым проблемы:
Код:
//neko_propagate.h
#ifndef _neko_propagate_
#define _neko_propagate_
#include "neko.h"
class neko_propagate :private neko
{
	public:
		neko_propagate();
		friend ostream & operator<<(ostream & out, const neko_propagate & to_out);
		friend istream & operator>>(istream & in, const neko_propagate & to_in);
};
neko_propagate::neko_propagate() :neko()
{
	tail=100;
	//don't work
	//compilator message: 7 C:\source\neko.h:9 'int neko::tail' is private
	//although above is: "class neko_propagate :private neko"
}
ostream & operator<<(ostream & out, const neko_propagate & to_out)
{
	to_out.neko::show_neko();
	return out;
}
istream & operator>>(istream & in, neko_propagate & to_in)
{
	char o_namae[100]; int t=0, h=0, w=0;
	cout<<"Enter a neko name: ";
	in.get(o_namae, 99); in.sync();
	cout<<"enter tail, hairy, and weight the neko: ";
	to_in.neko::o_namae_wa(o_namae);
	in>>t>>h>>w;
	//next no one string is work except "return in;"
	to_in.neko::axe(t);
	//compilator message: 14 C:\source\neko_propagate.h:29 'neko' is an inaccessible base of 'neko_propagate'
	//compilator message: 1 C:\source\neko.h:6 'class neko neko::neko' is inaccessible
	//compilator message: 12 C:\source\neko_propagate.h:29 within this context
	//and so on with all string
	//to_in.tail=t; //I was trying this way but also don't work
	to_in.neko::comb(h);
	to_in.neko::weigh(w);
	//what is wrong with my programme?
	return in;
}
#endif
Theseus вне форума Ответить с цитированием
Старый 21.07.2012, 19:24   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

class neko_propagate :private neko
_Bers вне форума Ответить с цитированием
Старый 21.07.2012, 19:25   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Private наследование не означает, что наследнику будут доступны private-члены класса. Оно означает, что public и protected члены родителя станут private членами потомка. Сделайте в базовом классе нужные вам члены protected, и они будут доступны в наследнике.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 21.07.2012, 19:34   #4
Theseus
Пользователь
 
Аватар для Theseus
 
Регистрация: 11.02.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Private наследование не означает, что наследнику будут доступны private-члены класса. Оно означает, что public и protected члены родителя станут private членами потомка. Сделайте в базовом классе нужные вам члены protected, и они будут доступны в наследнике.
но методы класса comb(), axe(), weigh() - являются public почему они то не доступны?
Код:
	public:
		neko();
		neko(const char * o_namae, int o_tail, float o_hairy, double o_weight);
		~neko();
		void o_namae_wa(const char * o_namae);
		void axe(int k);
		void comb(float k);
		void weigh(double k);
		void show_neko() const;
Theseus вне форума Ответить с цитированием
Старый 21.07.2012, 19:36   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Еще раз
Цитата:
...Оно означает, что public и protected члены родителя станут private членами потомка.
Методы neko стали private методами neko_propagate, потому и ошибки.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 21.07.2012, 19:37   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

А почитать книжку для самых маленьких, прежде чем задавать тупые вопросы не судьба?

http://yandex.ru/yandsearch?text=%D0...1%2B%2B&lr=240
_Bers вне форума Ответить с цитированием
Старый 21.07.2012, 19:38   #7
Theseus
Пользователь
 
Аватар для Theseus
 
Регистрация: 11.02.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Еще раз


Методы neko стали private методами neko_propagate, потому и ошибки.
так, а разве приватные методы недоступны в дружественных функциях?
Theseus вне форума Ответить с цитированием
Старый 21.07.2012, 19:43   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Theseus Посмотреть сообщение
так, а разве приватные методы недоступны в дружественных функциях?
Друзьям доступно все, что доступно классу, который объявил этих друзей. Но так как самому классу не доступны методы предка, то и друзьям класса они так же не доступны
_Bers вне форума Ответить с цитированием
Старый 21.07.2012, 19:50   #9
Theseus
Пользователь
 
Аватар для Theseus
 
Регистрация: 11.02.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Но так как самому классу не доступны методы предка, ...
ммм.... так, а почему тогда доступна функция "neko::show_neko()" ??
Theseus вне форума Ответить с цитированием
Старый 21.07.2012, 20:04   #10
Theseus
Пользователь
 
Аватар для Theseus
 
Регистрация: 11.02.2009
Сообщений: 29
По умолчанию

Кажется разобрался, спасибо всем за ответы. В книге Праты по С++ много букв но всё как-то запутано описывается, в частности если бы там был абзац следующего содержания:
Цитата:
В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:

при public-наследовании все спецификаторы остаются без изменения.
при protected-наследовании все спецификаторы остаются без изменения, кроме спецификатора public, который меняется на спецификатор protected (то есть public-члены базового класса в потомках становятся protected).
при private-наследовании все спецификаторы меняются на private.


Одним из основных преимуществ public-наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать:
A* a = new B;

Эта интересная особенность открывает возможность динамической идентификации типа (RTTI).
это намного прояснило бы ситуацию чем та куча воды которая там есть.
Theseus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ наследование world12_tk Помощь студентам 1 05.01.2012 03:14
Наследование. ISV-777 Общие вопросы по Java, Java SE, Kotlin 1 05.12.2011 22:31
Наследование С++ Vasyl'eva Помощь студентам 0 04.12.2011 19:40
Наследование Сергей089 Помощь студентам 6 07.02.2010 12:04
Наследование beregok Общие вопросы C/C++ 1 04.07.2009 22:39