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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 02:52   #11
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, раз такое дело, то в принципе можно получить доступ к конкретному методу через явное указание его области видимости, при этом приводить тип нет необходимости, правда не знаю, то ли это, что Вам нужно, так как не в курсе, какой при этом генерируется код
Код:
// classes declaration and implemantation
void main()
{   
	C *obj=new C;
	
	obj->Vabstract::set(1000,1000);
	obj->A::set(10,10);
	obj->B::set(20,20);
	obj->set(30,30);

	obj->getInfoX();
	obj->getInfoA();
	obj->getInfoB();
	obj->getInfoC();

	delete(obj);
};
Вообще интересно было бы почитать Вашу статью, для самообразования
Кстати, если не секрет, с помощью какого компилятора проводятся тесты?
netrino вне форума Ответить с цитированием
Старый 15.11.2009, 04:23   #12
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Спасибо...
Блин, я тоже только что нашёл это решение... я опоздал, хотел первым. Как я мог забыть, конечно, я читал про расширение видимости. Как приятно когда сам до чего-то доходишь, даже приятнее чем по подсказке.

Компилятор на VC++ 2008. Потом может быть проверю на разных методах компиляции с оптимизации и без и схожесть с VC++ 6.0.

Статьи состоят из частей (уже 3 сделаны кое-как будет их около 5), но пока не готовы и требуют тщательной доработки. Очень виню себя за глупые ошибки как например с конструктором копирования, который я перепутал с типов привидения к объекту.

Когда все статьи сделаю то создам тему для обсуждения и добровольных указаний-корректировок из-за того что я могу путать понятия в С++ и излагать не правильно какие-то мысли.

Пару статей можно посмотреть по ссылкам. Часть 1 Часть 2.

У меня опять проблема. Просьба не обращать внимания на не правильные сущности... Виртуальная функция GetInfo не может быть определена....

error C2250: World: неоднозначное наследование "void control::GetInfo(void)" (указатель компилятора становится на ошибке указанной ниже)

Код:
#include <stdio.h>

class control{
public:
	int x,y,z,ID;
	control(){x=y=z=0;}
	void move(int dx,int dy, int dz)
	{x+=dx;y+=dy;x+=dz;GetInfo();}
	virtual void GetInfo() // если убрать virtual, то без ошибок выводятся координаты, а они не должны выводится, т.к. GetInfo должно работать в своих контекстах: классов Player и Building
	{printf("x= %d y= %d z= %d\n",x,y,z);}
};
class Player: public virtual control{
public:
	int Health;
	virtual void Set(int id, int health)
	{ID=id; Health=health; GetInfo();}
	void GetInfo()
	{printf("PlayerID= %d Health= %d\n",ID,Health);}
};

class Building: public virtual control{
public:
	int Health,SpeedOfC;
	virtual void Set(int id, int health, int Speed)
	{ID=id; Health=health;SpeedOfC=Speed; GetInfo();}
	void GetInfo()
	{printf("Building ID= %d Health= %d SpeedOfC= %d\n",ID,Health,SpeedOfC);}
};

class World: public Player, public Building{
	int IDd;
public:
	void Set(int id)
	{IDd=id;}
}; //* ошибка

void main()
{   
	World *obj=new(World);
	obj->Set(1);

	obj->Player::Set(1,200);
	obj->Building::Set(1,1000,5);

	obj->Player::move(5,5,0);
	obj->Building::move(6,6,0);

	obj->Player::control::GetInfo();
	obj->Building::control::GetInfo();

	delete(obj);
};
Если есть желание помогите разобраться +)
Надеюсь в частности на Вашу поддержку, netrino.

Функция GetInfo должна работать в своих контекстах.

Последний раз редактировалось Stilet; 19.11.2009 в 11:46.
MasterGH вне форума Ответить с цитированием
Старый 19.11.2009, 11:44   #13
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А для класса World какая именно функция должна выполняться?
Player::GetInfo() или Building::GetInfo() ? Компилятор сам не может это определить.
pu4koff вне форума Ответить с цитированием
Старый 19.11.2009, 15:00   #14
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
А для класса World какая именно функция должна выполняться?
Player::GetInfo() или Building::GetInfo() ? Компилятор сам не может это определить.
Посмотрите вот этот момент:

void move(int dx,int dy, int dz)
{x+=dx;y+=dy;x+=dz;GetInfo();}

И этот

obj->Player::move(5,5,0); //внутри должна вызваться Player::GetInfo()
obj->Building::move(6,6,0);//внутри должна вызываться Building::GetInfo()
MasterGH вне форума Ответить с цитированием
Старый 19.11.2009, 15:43   #15
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Нужно смотреть на этот момент:
Код:
class World: public Player, public Building{
	int IDd;
public:
	void Set(int id)
	{IDd=id;}
}; //* ошибка
В классе World функция GetInfo не перегружена, значит она наследуется от предков, а у обоих из них она есть. Именно на это компилятор и ругается. Потому что тут какая именно должна быть вызвана функция:
Код:
World a;
a.GetInfo(); // как для объекта класса Player её вызывать компилятору или как Building ?
pu4koff вне форума Ответить с цитированием
Старый 19.11.2009, 16:02   #16
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Хорошо GetInfo() должна быть в World, т.е. переопределена в классе World.

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


Цитата:
World a;
a.GetInfo(); // как для объекта класса Player её вызывать компилятору или как Building ?
Это вопрос ко мне?
Здесь должна вызваться только World::GetInfo() и классы Player и Building тут вообще не причём.

Я же Вам написал ключевой момент :
void move(int dx,int dy, int dz)
{x+=dx;y+=dy;x+=dz;GetInfo();}
GetInfo() должна вызваться в котекстах (выделенны жирным)

obj->Player::move(5,5,0);{ID=id; Health=health; GetInfo();}
obj->Building::move(6,6,0);{ID=id; Health=health; GetInfo();}

А вызывается всегда метод конечного производного класса, т.е.
World:

obj->Player::move(5,5,0);{ID=id; Health=health; World::GetInfo();

А должно быть по идее работы виртуальных функций:
obj->Player::move(5,5,0);{ID=id; Health=health; Player::GetInfo();
obj->Building::move(5,5,0);{ID=id; Health=health; Building::GetInfo();
MasterGH вне форума Ответить с цитированием
Старый 19.11.2009, 16:11   #17
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Блин. Используешь виртуальные там, где они наоборот не нужны. Они создавались для такого поведение, которое тебе наоборот не нужно и от которого нужно избавиться. Убери virtual у GetInfo и наслаждаёся "правильной" работой.
Не виртуальная функция выполняется в контексте класса, который ему подсунули. А виртуальная сначала смотрит для объекта какого класса на самом деле она вызывается и в контексте этого класса и вызывается.
pu4koff вне форума Ответить с цитированием
Старый 19.11.2009, 16:18   #18
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Похоже я переборщил Перезанимался. Спасибо.

Последний раз редактировалось MasterGH; 19.11.2009 в 16:22.
MasterGH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в классах и функциях. Serror Общие вопросы C/C++ 11 10.10.2009 06:23
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55
Небольшой этический вопросик о классах. Longedok Помощь студентам 2 04.08.2008 13:23
реализация стратегии на классах mahsus Общие вопросы C/C++ 1 28.12.2007 10:27