Как вызвать метод родительского класса c
Перейти к содержимому

Как вызвать метод родительского класса c

  • автор:

Как вызвать метод родительского класса c

subj — как? Например, в таком коде:
class Base .
>;
class Child:public Base void f()
>;
.
Base * p = new Child;
p->f();

При этом, вообще говоря, я точно не знаю, что запишется в p — Child или Base (через p = new Base. Во втором случае, разумеется, f вызывать не надо. Могу ли я вообще выяснить, что в указателе p у меня сидит — Child или Base?
Всем заранее спасибо.

Re: Вызов метода дочернего класса из указателя на базовый

От: MaximE
Дата: 16.11.03 16:44
Оценка:

gde11 wrote:

g> subj — как? Например, в таком коде:
g> class Base <
g> .
g> >;
g> class Child:public Base <
g> void f()
g> >;
g> .
g> Base * p = new Child;
g> p->f();

g> При этом, вообще говоря, я точно не знаю, что запишется в p — Child или Base (через p = new Base. Во втором случае, разумеется, f вызывать не надо.

Можно сделать функцию f() виртуальной.

struct Base < virtual void f() < /* ничего здесь не делаем */ > >; struct Child : Base < virtual void f() < cout "Child"; > >; // . Base* p1 = new Base; Base* p2 = new Child; p1->f(); // вызов Base::f p2->f(); // вызов Child::f

g> Могу ли я вообще выяснить, что в указателе p у меня сидит — Child или Base?

Можешь при помощи dynamic_cast<> (при преобразовании к указателю вернет 0, если Base не является на самом деле Child):

if(Child* с = dynamic_cast(p)) c->f();

Posted via RSDN NNTP Server 1.8 beta
Re: Вызов метода дочернего класса из указателя на базовый

От: Herclia
Дата: 17.11.03 07:42
Оценка:

Здравствуйте, gde11, Вы писали:

G>При этом, вообще говоря, я точно не знаю, что запишется в p — Child
G>или Base (через p = new Base

Перегрузка и виртуальные функции.

Я постараюсь, решить сразу две проблемы, вызов базового
класса через производный, а так же присутствие виртуальных
функций в базовом классе.
Итак. Если мы используем virtual определения функций в
базовом и соответственно в наследуемом классе, то это —
полиморфизм. Что это такое, «. способность объекта
изменять форму во время выполнения программы. «.

include "iostream.h" class CPhone < public: virtual void Call() < printf( "\n Я базовый класс Phone"); > >; class CPayPhone : public CPhone < public: virtual void Call() < printf( "\n Опустите монету, класс CPayPhone \n" ); > >; int main(int argc, char* argv[]) < CPhone _obj_Phone; CPayPhone _obj_PayPhone; // N% 1 _obj_Phone.Call(); _obj_PayPhone.Call(); /* output. Я базовый класс Phone Опустите монету, класс CPayPhone */ // N% 2 CPhone* pnt_2 = &_obj_Phone; pnt_2->Call(); /* output. Я базовый класс Phone */ // N% 3 CPhone* pnt_3 = &_obj_PayPhone; pnt_3->Call(); /* output. Опустите монету, класс CPayPhone */ return 0; >

Разбор полетов.
Если при организации указателя на класс участвуют оба
класса необходимо посмотреть определены ли в базовом классе
виртуальные функции. Почему ? Потому как, если данное
определение(virtual) присустствует, вызывается функция того
класса который стоит справа(естественно, кастинг должен быть
корреректный, справа стоит производный класс).
Если НЕТ виртуальных функций, что определено слева, то и
вызывается .

// cod. CPayPhone obj; CPhone* pnt = &obj; // ссылка на класс CPayPhone, если функция Call() определена, // как виртуальная. CPhone* pnt = &obj; // если виртуальных функций в базовом классе не определено, // то эта ссылка на класс CPhone, даже если физически написано // &obj( указатель на CPayPhone).

Уважаемый gde11, по моему скромному мнению, можно
перекопировать и запустить данный пример, посмотрев, при
этом что будет выводиться на экране. Поэкспериментировать,
например, УБРАВ . virtual в базовом классе.

Маленький совет(правило правой руки):

Если в классе CPhone, определена виртуальная функция. И
после данного равенства вызывается именно она, будет
ипользованна функция класса CPayPhone. Другими словами,
полиморфизм — возможность менять поведение, если это так, то
я хочу поменять поведение моего базового класса, как ?
Присвоив ему указатель на производный, т.е. тот, который,
стоит справа. Поэтому в данном случае вызывается функция
Call класса CPayPhone.

[C++] Как из метода прозводного класса вызвать метод базового класса с тем же именем?

Что-то не могу понять, можно ли такое провернуть в C++.

Есть базовый класс, и производный от него. В базовом классе есть некий метод (не чисто виртуальный, а с кодом). Пускай он называется action() к примеру.

Метод action() переопределяется в производном классе. И вот стоит задача в методе action() производного класса вызвать метод action() базового класса.

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

Вопрос — возможно ли так сделать в C++? Если возможно, то как?

Вызов метода родительского класса

Но в классе CountDn нет конструктора, каким же образом выполняется инициализация? Оказывается, что если мы не определили конструктор производного класса, то будет использован подходящий конструктор базового класса. . Объект производного класса также может использовать методы operator++() и get_count() из базового класса.

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

Далее я делаю задание:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#pragma once class Counter { protected: unsigned int count; public: Counter(); Counter(unsigned int value); unsigned int getValue() const; const Counter & operator++ (); };

Counter.cpp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include "Counter.h" Counter::Counter() : count(0) { //The empty body of the constructor } Counter::Counter(unsigned int value) : count(value) { //The empty body of the constructor } unsigned int Counter::getValue() const { return count; } const Counter & Counter::operator++ () { return Counter(++count); }
1 2 3 4 5 6 7 8 9 10 11 12
#pragma once #include "Counter.h" class CountDn : public Counter { public: CountDn(); CountDn(unsigned int value); const CountDn & operator-- (); };

CountDn.cpp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include "CountDn.h" CountDn::CountDn() : Counter() { //The empty body of the constructor } CountDn::CountDn(unsigned int value) : Counter(value) { //The empty body of the constructor } const CountDn & CountDn::operator-- () { return CountDn(--count); }

CountFull.h

1 2 3 4 5 6 7 8 9 10 11 12 13 14
#pragma once #include "CountDn.h" class CountFull : public CountDn { public: CountFull(); CountFull(unsigned int value); const CountFull & operator--(int); const CountFull & operator++(int); };

CountFull.cpp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include "CountFull.h" CountFull::CountFull() : CountDn() { } CountFull::CountFull(unsigned int value) : CountDn(value) { } const CountFull & CountFull::operator++(int) { return CountFull(count++); } const CountFull & CountFull::operator--(int) { return CountFull(count--); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include "CountFull.h" #include using namespace std; int main() { CountFull a = 1; ++a; --a; cout  a.getValue()  endl; system("PAUSE"); return EXIT_SUCCESS; }

И компилятор выдает следующую ошибку:

error C2675: унарный «++»: «CountFull» не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

Подскажите, пожалуйста, почему так и с чем это связано? Ведь я, например, могу вызывать для объект CountDn метод operator—. Почему для второго наследования это не работает?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вызов конструктора из родительского класса
Как вызвать конструктор для производного класса из родительского?

Вызов конструктора родительского класса
Здравствуйте, столкнулся с такой проблемой: при вызове конструктора класса потомка (Derv1) через.

Вызов функции родительского класса в наследнике
Подскажите, пожалуйста, можно ли вызвать функцию родительского класса если в наследнике уже есть.

Вызов функций наследников из родительского класса
Здравствуйте, нужно сделать вызов функции из функции родителя. void Ape(char key) < key =.

495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557

ЦитатаСообщение от Nishen Посмотреть сообщение

const CountFull & CountFull::operator++(int)

Это постфиксный оператор, а в коде вызывается префиксный.

Добавлено через 53 секунды

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
class Counter { protected: unsigned int count; public: Counter() : count(0) {} Counter(unsigned int value) : count(value) {} unsigned int getValue() const { return count; } Counter & operator++ () { ++count; return *this; } }; class CountDn : public Counter { public: CountDn() : Counter() {} CountDn(unsigned int value) : Counter(value) {} CountDn & operator-- () { --count; return *this; } }; class CountFull : public CountDn { public: CountFull() : CountDn() { } CountFull(unsigned int value) : CountDn(value) { } CountFull & operator++() { ++count; return *this; } CountFull & operator--() { --count; return *this; } CountFull operator++(int) { CountFull temp(*this); ++count; return temp; } CountFull operator--(int) { CountFull temp(*this); --count; return temp; } }; using namespace std; int main() { CountFull a = 1; a++; --a; --a; cout  a.getValue()  endl; }

Добавлено через 1 минуту

ЦитатаСообщение от Nishen Посмотреть сообщение

Как вызвать родительский метод из тела перегруженного в С++?

Есть класс. У него есть другой класс-наследник. В нём перегружается родительский метод. Мне нужно из перегруженного метода наследника, вызвать метод родителя. Как это сделать?

class Foo < public: void example()< // Код родителя >>; class Bar : public Foo < public: void example()< // Тут должен выполнится код родителя // А тут - код наследника >>; 

Отслеживать
44.8k 3 3 золотых знака 38 38 серебряных знаков 89 89 бронзовых знаков
задан 12 янв 2017 в 18:34
303 4 4 серебряных знака 12 12 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Можете сделать это следующим образом

void example() < Foo::example(); // А тут - код наследника >
void example()< this->Foo::example(); // А тут - код наследника > 

или (при условии, что метод не является виртуальным), например, так

void example()< static_cast( this )->example(); // А тут - код наследника > 

Так как метод, объявленный в производном классе, скрывает одноименный метод в родительском классе, то следует использовать квалифицированное имя метода родительского класса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *