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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 00:19   #1
petrovich985
Подтвердите свой е-майл
 
Регистрация: 16.12.2010
Сообщений: 5
По умолчанию Проблема с виртульными функциями

Здравствуйте! У меня возникла проблема с обращением к именно той виртуальной функции, которая мне нужна. У меня есть класс содержащий поля а и в, также есть наследник этого класса. В главном классе есть виртуальная функция складывающая поля (int) а и в, и такая же в производном классе. Так вот, я хочу создать
массив указателей, выделить память в каждом элементе под объект производного класса. Но как обратится к нужной виртуальной функции нужного элемента, мне не понятно.

Код:
Код:
#include <iostream>
using namespace std;

class basa_1
{
public:
	int a,b;
	virtual void pribav()
	{
		cout <<endl << " is basa_1 a+b = " << a+b << endl; cin.get();		
	}
};

class basa_2 : public basa_1
{
public:
	int x;
	void set()
	{
		cout << "a = "; cin >> a; cin.get();
		cout << "b = "; cin >> b; cin.get();
		cout << "x = "; cin >> x; cin.get();
	}
	void print()
	{
		cout << "a = " << a << ",  b = " << b << ",  x = " << x; cin.get();
	}
	virtual void pribav()
	{
		cout <<endl << " is basa_2 a+b = " << a+b << endl; cin.get();		
	}
};


void main()
{
	int n, u, i, g; u = 100;
	cout << "vvedite skolco --> "; cin >> n; cin.get();
	basa_1 *p_1[10], *m, t;
	for (i = 1; i<=n; ++i)
	{
		p_1[i] = new basa_1;
	}
	basa_2 *p_2[10];
	for (i = 1; i<=n; ++i)
	{
		p_2[i] = new basa_2;
	}
	while (u != 0)
	{
		cout << "vvedite 0, 1, 2, 3, 4 --> ";
		cin >> u;
		if (u == 0) {exit(2);}
		if (u == 1)
		{
			cout << endl << "nachinaetsi vvod!" << endl; cin.get();
			for (i = 1; i<=n; ++i)
			{
				p_2[i]->set();
			}
			cout << endl << "vvod zaconchen!" << endl; cin.get();
		}
		if (u == 2)
		{
			cout << endl << "nachinaetsi vivod!" << endl; cin.get();
			for (i = 1; i<=n; ++i)
			{

				p_2[i]->print();
			}
			cout << endl << "vivod zaconchen!" << endl; cin.get();
		}
		if (u == 3)
		{
			for (i = 1; i<=n; ++i)
			{
				//здесь должна вызываться функция из класса basa_1, i - го указателя, через указатель m 
			}
		}
		if (u == 4)
		{
			for (i = 1; i<=n; ++i)
			{

				//здесь должна вызываться функция из класса basa_2, i - го указателя, через указатель m
			}
		}
		
	}
}
Без массива указателей все просто, там примерно так может выглядеть:
basa_1 *m, t;
basa_2 t_2;

m = &t;
m->pribav(); - будет вызвана функ. из класса basa_1

m = &t_2;
m->pribav(); - будет вызвана функ. из класса basa_2

А вот как реализовать этот метод с массивом указателей?
petrovich985 вне форума Ответить с цитированием
Старый 17.12.2010, 02:21   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

просто создай массив указателей на класс base и заполни его указателями и на base, и на производный
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 вне форума Ответить с цитированием
Старый 17.12.2010, 09:56   #3
petrovich985
Подтвердите свой е-майл
 
Регистрация: 16.12.2010
Сообщений: 5
По умолчанию

то есть вот так получается:
Код:
basa_1 *p_1[10], *m, t;
	basa_2 *y;
	for (i = 1; i<=n; ++i)
	{
		p_1[i] = m, y;
	}
Но при этом я не могу вызвать не одну функцию, как например где if (u == 1) или if (u == 2). Там автоматом выбор падает только на функции из basa_1, как быть с этим?
petrovich985 вне форума Ответить с цитированием
Старый 17.12.2010, 12:55   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2petrovich985
чет я тя не пойму. вот смотри пример

Код:
class Base {
public:
	virtual ~Base()
	{

	}

	virtual void foo()
	{
		cout << "Base::foo" << endl;
	}
};

class Derived : public Base {
public:
	virtual void foo()
	{
		cout << "Derived::foo" << endl;
	}
};

int main()
{
	// массив из 5 указателей на base
	Base *pArr[5];
	
	// заполняем его как указателями на base, так и на derived
	pArr[0] = new Base;
	pArr[1] = new Derived;
	pArr[2] = new Base;
	pArr[3] = new Derived;
	pArr[4] = new Base;

	// вызываем foo
	for (int i = 0; i < 5; i++)
		pArr[i]->foo();

	return 0;
}
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 вне форума Ответить с цитированием
Старый 17.12.2010, 19:43   #5
petrovich985
Подтвердите свой е-майл
 
Регистрация: 16.12.2010
Сообщений: 5
По умолчанию

Мне нужно что бы через pArr[i] я мог вызывать функцию которая может находится и в base и в derived путём (один из вариантов) присвоения адреса объекта и дальше запуск нужной виртуальной функции зависел бы от типа объекта, адрес которого я присвоил до этого.
petrovich985 вне форума Ответить с цитированием
Старый 17.12.2010, 20:25   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2petrovich985

ну а я что тебе написал?
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 вне форума Ответить с цитированием
Старый 17.12.2010, 20:37   #7
petrovich985
Подтвердите свой е-майл
 
Регистрация: 16.12.2010
Сообщений: 5
По умолчанию

Я имею в виду, что вызывать виртуальную функцию из pArr[1], как из derived так и из base. А у тебя чередуется pArr[0] - функция из base, pArr[1] - функция из derived. Я там пример приводил, как это может выглядеть но без массива указателей, то есть использовался один указатель
petrovich985 вне форума Ответить с цитированием
Старый 18.12.2010, 20:39   #8
petrovich985
Подтвердите свой е-майл
 
Регистрация: 16.12.2010
Сообщений: 5
По умолчанию

Ок, зайдём с другой стороны, как там где u = 3 вызвать виртуальную функцию из basa_1, а где u = 4 вызвать виртуальную функцию из basa_2

Код:
#include <iostream>
using namespace std;

class basa_1
{
protected:
	int a,b;
public:
	virtual void pribav()
	{
		cout <<endl << " is basa_1 a+b = " << a+b << endl; cin.get();
	}
};

class basa_2 : public basa_1
{
	int x;
public:
	void set()
	{
		cout << "x = "; cin >> x; cin.get();
		cout << "a = "; cin >> a; cin.get();
		cout << "b = "; cin >> b; cin.get();
	}
	void print()
	{
		cout << "a = " << a << ",  b = " << b << ",  x = " << x; cin.get();
	}
	virtual void pribav()
	{
		cout <<endl << " is basa_2 a+b = " << a+b << endl; cin.get();
	}
};


void main()
{
	int n, u, i, g; u = 100;
	cout << "vvedite skolco --> "; cin >> n; cin.get();
	basa_1 *p_1, *m;
	basa_2 *p_2; 
	p_2 = new basa_2 [n];
	while (u != 0)
	{
		cout << "vvedite 0, 1, 2, 3, 4 --> ";
		cin >> u;
		if (u == 0) {exit(2);}
		if (u == 1)
		{
			cout << endl << "nachinaetsi vvod!" << endl; cin.get();
			for (i = 0; i<n; i++)
			{
				p_2[i].set();
			}
			cout << endl << "vvod zaconchen!" << endl; cin.get();
		}
		if (u == 2)
		{
			cout << endl << "nachinaetsi vivod!" << endl; cin.get();
			for (i = 0; i<n; i++)
			{
				p_2[i].print();
			}
			cout << endl << "vivod zaconchen!" << endl; cin.get();
		}
		if (u == 3)
		{
			for (i = 0; i<n; i++)
			{
				m = &p_2[i];
				m->pribav();
			}
		}
		if (u == 4)
		{
			for (i = 0; i<n; i++)
			{
				p_2[i].pribav();
			}
		}
		
	}
}
petrovich985 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с функциями из math.h maryan.vetrov Общие вопросы C/C++ 2 01.08.2010 19:34
Проблема с функциями(передача масива в функцию типа int) sekator Общие вопросы C/C++ 4 27.07.2010 22:13
проблема с функциями world12_tk Помощь студентам 6 03.03.2009 19:34
Задача с функциями Серафимий Долговяз Помощь студентам 2 31.01.2009 18:32
Работа с функциями Worms Общие вопросы Delphi 1 02.12.2007 15:51