Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Наследование


Автор: FTK 13.6.2005, 18:30
Всем Привет!

Скажите пожалуйста, в чем отличие наследования:

Код

class B //базовый 
{
     //********************//
}

class B1:public B 
{
     //********************//
}

от

Код

class B2:protected  
{
     //********************//
}

и

Код

class B3:private
{
     //********************//
}


Буду очень благодарен, если визуально поясните =))



Автор: comcon1 13.6.2005, 18:57
Вот тебе пример. Стоит заменить спецификатор наследования с PUBLIC на PRIVATE или PROTECTED. И компилятор ругнется в помеченной мною строчке.

Код

#include <iostream.h>
using namespace std;
class B {
    public:
        void pubfunc() {
            cout << "PUSH ME I'm PUBLIC class B" << endl;
        }
    private:
        void privfunc() {
            cout << "PUSH ME I'm PRIVATE class B" << endl;
        }
};

class B1: public B {
    public:
       void myfunc() {
           cout << "I'm class B1" << endl;
       }
};


int main() {
    B myclass;
    B1 inhclass;
    myclass.pubfunc();
    inhclass.pubfunc(); /// <<<<<<<<<<<<<<<<<<<<<<<<<
    inhclass.myfunc();
}

Добавлено @ 19:02
Вообще если ты наследуешь метод с каким-то спецификатором доступа:

class A{
...
public:
void metod();
..
};

А класс наследуешь, к примеру:

class B: protected A { ...

то public "умножить" на protected дает protected. И в классе B этот метод будет иметь аттрибут protected.

А вообще есть таблица умножения для аттрибутов доступа. Посмотри ее в учебнике. Вот.

Автор: FTK 13.6.2005, 19:05
Так в чем же разница? Если наследование public, то доступ тоже только к public?
Я что-то опять ничего не понял....


Код

if (me==lamer) Don't think very bad;
else write me answer


=)

Автор: comcon1 13.6.2005, 19:09
Смотри. В моем примере. метод pubfunc() имеет аттрибут public.
Если я наследую класс как public, то public умножить на public будет public.

И через производный класс я получаю доступ к pubfunc().

Теперь, если я наследую класс как private, то private умножить на public будет private и через производный класс я доступ к pubfunc() НЕ ПОЛУЧАЮ. И компилятор ругается на ту строчку, где я указал smile.

Попробуй написать и ставить разные аттрибуты - сам увидишь, когда открывается тебе доступ, когда нет.

Автор: FTK 13.6.2005, 19:13
Теперь понял. smile
Тогда еще вопрос: А где найти эту таблицу?
Может есть электронная версия у тебя?


Thanks for all, who have ever helped me///

Автор: comcon1 14.6.2005, 09:43
Private x (something) = private
Public x public = public
Protected x (Public or Protected) = protected

Автор: FTK 15.6.2005, 00:48
comcon1 Благодарю за помощь, теперь уж точно все ясно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)