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


Автор: FTK 11.6.2005, 15:46
Привет Всем!!!


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

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

Если можно, то желательно с иллюстрацией =) smile

Автор: Irokez 11.6.2005, 15:52
кажется так:
Код

BaseClass::method();

Автор: srd 11.6.2005, 15:54
Код

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;
}


Автор: jorkug 12.6.2005, 04:11
Код

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

Автор: srd 12.6.2005, 06:33
jorkug
Это будет работать неправильно, если метод виртуальный.

Автор: jorkug 12.6.2005, 06:57
srd
Да, но в противном случае это гораздо удобней

Автор: FTK 13.6.2005, 17:07
Большое спасибо, помогли =))

Автор: Earnest 17.6.2005, 21:10
Цитата(jorkug @ 12.6.2005, 04:11)
Код

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

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

child->Parent::metod();

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

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

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

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

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