Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Class...help, никак не разобраться... 
:(
    Опции темы
FTK
Дата 11.6.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.6.2005

Репутация: нет
Всего: нет



Привет Всем!!!


Сейчас еще учусь, помогите кто-нибудь ответить на такой вопрос:

Как вызвать метод базового класса из объекта производного класса, если в производном классе этот метод был замещен?

Если можно, то желательно с иллюстрацией =) smile
PM MAIL   Вверх
Irokez
Дата 11.6.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



кажется так:
Код

BaseClass::method();

PM   Вверх
srd
Дата 11.6.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Код

class Base
{
public:
    void doSomething(void)
    {
        std::cout << "Base::doSomething\n";
    }
};

class Child : public Base
{
public:
    void doSomething(void)
    {
        Base::doSomething();
        std::cout << "Child::doSomething\n";
    }
};

int main(void)
{
    Child child;
    child.doSomething();
    return 0;
}




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
jorkug
Дата 12.6.2005, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 21.3.2005

Репутация: нет
Всего: 1



Код

Child *child = new Child;
((Parent*)child)->metod();

PM MAIL   Вверх
srd
Дата 12.6.2005, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



jorkug
Это будет работать неправильно, если метод виртуальный.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
jorkug
Дата 12.6.2005, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 21.3.2005

Репутация: нет
Всего: 1



srd
Да, но в противном случае это гораздо удобней
PM MAIL   Вверх
FTK
Дата 13.6.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.6.2005

Репутация: нет
Всего: нет



Большое спасибо, помогли =))
PM MAIL   Вверх
Earnest
Дата 17.6.2005, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(jorkug @ 12.6.2005, 04:11)
Код

Child *child = new Child;
((Parent*)child)->metod();

Может, еще не поздно...
Чтобы в этом примере все работало правильно и с виртуальными функциями, надо писать так:
Код

child->Parent::metod();



--------------------
...
PM   Вверх
comcon1
Дата 17.6.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Скорее всего, нет (но это не точно. Сейчас компилятор не под рукой :-( )Если ты хочешь обращаться к методу родительского класса по-другому, чем к методу ребенка, то зачем тебе делать метод виртуальным???
Хотя, бывает, надо. Сделай два метода - виртуальный и обычный и используй.


--------------------
PM MAIL   Вверх
Earnest
Дата 18.6.2005, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Если в производном классе определен метод с тем же именем, что и в базовом, но с другой сигнатурой, что часто бывает удобно, то метод базового класса для компилятора невидим.

Способов борьбы 2:
1) как было написано ранее, base_class::method()
2) в определении производного класса написать using base_class::metod,

Второй способ открывает все методы базового класса с таким именем; кроме того, он же позволяет изменять доступ к методам. Скажем, в базовом классе метод объявлен как protected. Если в производном поместить using в раздел public, то метод станет виден всем (при доступе через производный класс, конечно), а если, наоборот, в private - то свои потомки до него уже не доберутся.
Кроме того, использование using позволяет открывать методы базового класса при private и protected наследовании.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.