Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2011, 11:34   #1
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию Проблема с методом при наследовании

Добрый день. Проблема такая: есть базовый класс, в нём метод - возвращающий ссылку на объект данного класса:

Base & foo() {return *this;}

Надо сделать так, чтобы для дочернего класса срабатывала та же функция, но возвращала ссылку не на базовый класс, а естественно на самого наследника. Можно ли это как-то сделать, не переопределяя функцию в дочернем классе?

Вот пример:
Код:
class Base
{

public:
	Base(int x): myX(x) {};
	Base & foo() 
	{
		// оределённые действия в функции
		return *this;
	}
private:
	int myX;
};

class Child : public Base
{

public:
	Child(int x, int y): Base(x), myY(y){};
private:
	int myY;
};

int main()
{
	Child source(1, 2);
	Child copy = source.foo(); // ошибка, т.к. функция возвращает Base&

        return 0;
}
rommster вне форума Ответить с цитированием
Старый 15.09.2011, 13:52   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а откуда ваш базовый класс узнает о наследниках?
counter вне форума Ответить с цитированием
Старый 15.09.2011, 14:26   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
// ошибка, т.к. функция возвращает Base&
приведение типов не отменяли.
кстати, в вашем примере толку нету от возврата ссылки, так как всеравно в бой идет конструктор коирования.

а так, гляньте:
http://programmersforum.ru/showthread.php?t=129110
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2011, 14:49   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса
Цитата:
приведение типов не отменяли.
срезку тоже
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 15.09.2011, 15:12   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

срезку ?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2011, 18:39   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от rommster Посмотреть сообщение
Добрый день. Проблема такая: есть базовый класс, в нём метод - возвращающий ссылку на объект данного класса:

Base & foo() {return *this;}

Надо сделать так, чтобы для дочернего класса срабатывала та же функция, но возвращала ссылку не на базовый класс, а естественно на самого наследника. Можно ли это как-то сделать, не переопределяя функцию в дочернем классе?

Вот пример:
Код:
class Base
{

public:
	Base(int x): myX(x) {};
	Base & foo() 
	{
		// оределённые действия в функции
		return *this;
	}
private:
	int myX;
};

class Child : public Base
{

public:
	Child(int x, int y): Base(x), myY(y){};
private:
	int myY;
};

int main()
{
	Child source(1, 2);
	Child copy = source.foo(); // ошибка, т.к. функция возвращает Base&

        return 0;
}
Это делается с помощью виртуальных функций.

Код:
class Base
{
public:
...

	virtual Base & foo() 
	{
		// оределённые действия в функции
		return *this;
	}
...
};

class Child : public Base
{

public:
... 
 	Child & foo() 
	{
		// оределённые действия в функции
		return *this;
	}
..
};
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 15.09.2011 в 18:41.
Сыроежка вне форума Ответить с цитированием
Старый 15.09.2011, 18:52   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Сыроежка, разве Child::foo не должна быть так же виртуальной?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2011, 18:56   #8
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Сыроежка, разве Child::foo не должна быть так же виртуальной?
Насколько мне известно, она и является виртуальной. Ключевое слово virtual достаточно указать только в базовом классе.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание объектов класса при private-наследовании _-Re@l-_ Общие вопросы C/C++ 2 30.07.2011 12:52
Ошибка в наследовании классов Minus_yu PHP 7 24.02.2011 19:58
ГЛЮКИ при наследовании фреймов Delphi 7 AnTe Компоненты Delphi 3 10.12.2010 09:02
Как вызываются конструкторы объектов при наследовании? TwiX Общие вопросы C/C++ 10 17.11.2010 13:59
Перегрузка == при наследовании paramon Общие вопросы C/C++ 5 17.06.2008 00:17