Как вызвать метод родительского класса 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(); // А тут - код наследника >
Так как метод, объявленный в производном классе, скрывает одноименный метод в родительском классе, то следует использовать квалифицированное имя метода родительского класса.