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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2017, 14:19   #1
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию Приведение умных указателей базового типа к дочернему

И снова всем привет.
Столкнулась с проблемой, когда при передаче в функцию объектов разного типа нужно производить с ними разные действия (класс D, функция foo).

Прошу обратить внимание, что d.foo(c) не одно и то же с c.foo(d)

Код:
class A
{
public:
	A(int n) 
	{
		_number = n;		
	}
	int GetNumber() 
	{
		return _number;
	}
	virtual void foo(std::weak_ptr<A> param) = 0;
protected:
	int _number;
};

class B::public A
{
public:
	B(int n) : A(n){}
	virtual void foo(std::weak_ptr<A> param) 
	{
		cout << "DO NOTHING";
	}
};

class C::public A
{
public:
	C(int n) : A(n) {}
	virtual void foo(std::weak_ptr<A> param)
	{
		if (auto param1 = param.lock()) {
			cout << param1->GetNumber();
		}
	}
};

class D : public A
{
public:
	D(int n):A(n){}
	void plus(std::weak_ptr<B> param)
	{
		if (auto param1 = param.lock()) {
			std::cout << _number + param1->GetNumber();
		}
	}
	void minus(std::weak_ptr<C> param)
	{
		if (auto param1 = param.lock()) {
			std::cout << _number - param1->GetNumber();
		}
	}
	void multiply(std::weak_ptr<D> param)
	{
		if (auto param1 = param.lock()) {
			std::cout << _number * param1->GetNumber();
		}
	}	
	virtual void foo(std::weak_ptr<A> param)
	{
		//что нужно написать здесь, чтоб при получении параметра типа std::weak_ptr<В> вызывалась функция plus, std::weak_ptr<С> - minus, а std::weak_ptr<В> - multiply?
	}
};

void main()
{
	std::shared_ptr<A> b = std::make_shared<B>(2);
	std::shared_ptr<A> c = std::make_shared<C>(4);
	std::shared_ptr<A> d = std::make_shared<D>(3);

	std::shared_ptr<A> d2 = std::make_shared<D>(13);
	d2->foo(b);
	d2->foo(c);
	d2->foo(d);
}
В AS3 было нормальной практикой писать:
Код:
if(param is B)
{
     plus((B)param);
}
Как в С++ справляются с подобными задачами?
До применения умных указателей я делала так:
Код:
B* b = dynamic_cast<B*>(param);
if(b)
{
         plus(b);
}
Но что-то я не могу найти инфу про кастование умных указателей.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 15.08.2017, 14:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

http://en.cppreference.com/w/cpp/mem...r/pointer_cast
p51x вне форума Ответить с цитированием
Старый 17.08.2017, 22:24   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Спасибо, помогло!
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация умных указателей FIDE Общие вопросы C/C++ 26 11.03.2015 21:17
Приведение типа? Студ Общие вопросы C/C++ 5 11.04.2014 13:38
Проблема с приведением типа базового класса к типу дочернего sectors70 Общие вопросы C/C++ 10 19.11.2012 03:39
динамическое приведение типа the_deer_one C# (си шарп) 9 25.08.2012 20:59
Сабклассирование базового типа - куда прислать идею для C++0x? Ivan_32 Общие вопросы C/C++ 13 27.04.2011 21:47