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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2009, 16:32   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию наследование классов

Добрый день! Как вы думаете, что будет, если в наследовании классов в базовом и производном классах в функциях-элементах будет содержаться функция с одним и тем же именем, например, operator<<() и с одинаковыми формальными параметрами, тогда будет косяк, так?
то есть компилятор не будет знать, какой функцией он должен будет пользоваться, я прав?
Dimarik вне форума Ответить с цитированием
Старый 02.07.2009, 16:43   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Нормально всё должно быть. У каждой переменной есть тип, по этому типу находится класс и его методы. Если функция объявлена виртуальной, то уже проверяются наследники, а иначе - вызывается метод для текущего класса.
Код:
class A
{
public:
	void foo()
	{
		cout << "A::foo()" << endl;
	}
};

class B: public A
{
public:
	void foo()
	{
		cout << "B::foo()" << endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B b;
	A *a = &b;
	b.foo(); // Вызовется метод B::foo
	a->foo();// А тут будет вызван метод A::foo
}

Последний раз редактировалось pu4koff; 02.07.2009 в 17:38.
pu4koff вне форума Ответить с цитированием
Старый 02.07.2009, 17:07   #3
Victor Deltorro
Пользователь
 
Аватар для Victor Deltorro
 
Регистрация: 24.06.2009
Сообщений: 17
По умолчанию

Перегруженные операторы << и >> не могут быть функциями членами класса... Вот например простенький пример...
Заранее прошу прощения за синтаксис... если будут ошибки... писал в Блокноте...
Код:
class DataOne {
	int DataFirst;
	public:
	void FillData(int ValueFirst) {
		DataFirst = ValueFirst;
	}
	friend std::ostream &operator<<(std::ostream &StreamOne, DataOne CallOne);
};
class DataTwo: public DataOne {
	int DataSecond;
	public:
	void FillDataTwo(int ValueSecond) {
		DataSecond = ValueSecond;
	}
	friend std::ostream &operator<<(std::ostream &StreamTwo, DataTwo CallTwo);
};
std::ostream &operator<<(std::ostream &StreamOne, DataOne CallOne) 
{
	StreamOne<<CallOne.DataFirst;
	return Stream;
}
std::ostream &operator<<(std::ostream &StreamTwo, DataTwo CallTwo) 
{
	StreamTwo<<CallTwo.DataSecond;
	return Stream;
}
int main()
{
	DataOne *CallDataOne, Call;
	DataTwo CallDataTwo;

	CallDataOne = &Call;
	CallDataOne->FillData(100);
	std::cout<<CallDataOne;
	std::cout<<typeid(*CallDataOne).name()<std::endl;

	CallDataOne = &CallDataTwo;
	CallDataOne->FillDataTwo(100);
	std::cout<<CallDataOne;
	std::cout<<typeid(*CallDataOne).name();
}
Our span of life is brief, but is long enough for us to live well and honestly...
Victor Deltorro вне форума Ответить с цитированием
Старый 02.07.2009, 17:15   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

вот моя программа, точнее заголовочный файл
Код:
#include <iostream.h>
#ifndef Complex1_
#define Complex1_
class Complex
{       private:int a,b;
        public:
        Complex (int x, int y);
        Complex ();
        Complex operator+(Complex &m);
        Complex operator-(Complex &m);
        Complex operator*(Complex &m);
        ostream& operator<<(Complex &n);
};

//далее определяем функции
Complex::Complex(int x, int y)
{cout<<"Vvedite deistvitelnuu chast i mnimuu chast";
cin>>x>>y;
a=x;b=y;};
Complex::Complex()
{a=0;b=0;};
Complex Complex::operator+(Complex &m)// сумма 2ух комплексных чисел
{
Complex p;
p.a=a+m.a;
p.b=b+m.b;
return p;
};
Complex Complex::operator-(Complex &m)// произведение 2ух комплексных чисел
{
Complex p;
p.a=a-m.a;
p.b=b-m.b;
return p;
};
Complex Complex::operator*(Complex &m)// произведение 2ух комплексных чисел
{       
Complex p;
p.a=a*m.a-b*m.b;
p.b=a*m.b+b*m.a;
return p;
};
ostream & Complex::operator<<(Complex &n)
{
ostream s;
s<<n.a<<" + "<<n.b<<"i"<<endl;
return s;} ;
//наследование классов
class Chislo: public Complex //наследование класса//должен определить, комплексное это число или действительное (b=0||b!=0)
{
        public:  bool p;
        Chislo(int x, int y, bool q);
        Chislo(bool q);
        ostream &  operator<<(Chislo & t);
};
//функции-элементы
Chislo::Chislo(int x, int y, bool q):Complex(x,y)
{
        if(y=0) q=true;
        else
        q=false;
        p=q;
}
Chislo::Chislo(bool q):Complex()
{
        q=true; p=q;
}
ostream & operator<<(Chislo & t)
{          ostream rr;
        if(t.p=true) rr<<" deistvitelnoe ";
        else{rr<<" Complexnoe ";};
}
#endif
интересуют функции
ostream& operator<<(Complex &n);
и
ostream & operator<<(Chislo & t)
P.S. тут какие-то проблемы с ними, кто может, подскажите
Dimarik вне форума Ответить с цитированием
Старый 02.07.2009, 17:17   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а вот доказательство того, что перегруженный оператора operator<< может являться членом класса
Код:
#include <iostream.h>
class shet
{
private: int dol, euro;
public:
shet(int dol, int euro);
shet();
shet operator*(const shet &t) ;
friend ostream & operator<<(ostream &os, const shet &t);
};
shet sum(const shet &t);
otobr();
//далее идут прототипы функций, которые
//указаны в классе
        shet::shet( int dol,int euro)
        {
          this->dol=dol, this->euro=euro; //такое присвоение из-за того, что имена полей совпадают с именами аргументов
        };
        shet::shet( )
        {
          dol=0, euro=0; //задаю по умолчанию значения
        };
        shet shet::operator*(const shet &t)
        {
        shet m;
        m.dol=dol*t.dol;
        m.euro=euro*t.euro;
        return m;
        };
        ostream &  operator<<(ostream &os, const shet &t)
        {
        os<<t.dol<<"   dollarov   "<<t.euro<<"   euro"<<endl; return os;
        }

main()
{
shet A(5,6), B(10,11), C;    //придаём А и B значения A.dol=5, A.euro=6; для B аналогично

C=B*A;
cout<<C;
system("pause");
}
Dimarik вне форума Ответить с цитированием
Старый 02.07.2009, 17:19   #6
Victor Deltorro
Пользователь
 
Аватар для Victor Deltorro
 
Регистрация: 24.06.2009
Сообщений: 17
По умолчанию

Он у тебя объявлен с ключевым словом friend ... он не член... он Друг... который может обращаться к закрытым переменным.)
Our span of life is brief, but is long enough for us to live well and honestly...
Victor Deltorro вне форума Ответить с цитированием
Старый 02.07.2009, 17:32   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

pu4koff, я имел в виду, если бы, А был базовым классом, а В - наследованным классом
Dimarik вне форума Ответить с цитированием
Старый 02.07.2009, 17:38   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Dimarik, извиняюсь. Забыл наследование написать А так код получился у меня левый Сейчас поправлю
pu4koff вне форума Ответить с цитированием
Старый 02.07.2009, 18:24   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
class A
{
public:
	void foo()
	{
		cout << "A::foo()" << endl;
	}
};

class B: public A
{
public:
	void foo()
	{
		cout << "B::foo()" << endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B b;
	A *a = &b;
	b.foo(); // Вызовется метод B::foo
	a->foo();// А тут будет вызван метод A::foo
}
Ну да компилятор же смотрит на тип данных, а не на адрес, на который указывает указатель A *a. Тут уже нужно использовать виртуальные функции. Это полиморфизм.

Код:
class A
{
public:
	void foo()
	{
		cout << "A::foo()" << endl;
	}
};

class B: public A
{
public:
	virtual void foo()
	{
		cout << "B::foo()" << endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B b;
	A *a = &b;
	b.foo(); // Вызовется метод B::foo
	a->foo();// А тут будет вызван метод В::foo
}
P.S. Объяснял это все пользователю Dimarik на вашем примере

Последний раз редактировалось profi; 02.07.2009 в 18:43.
profi вне форума Ответить с цитированием
Старый 02.07.2009, 18:26   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

можете подсказать, тут 2 однотипные ошибки в заголовочном файле идут:
Код:
#include <iostream.h>
#ifndef Complex1_
#define Complex1_
class Complex
{       private:int a,b;
        public:
        Complex (int x, int y);
        Complex ();
        Complex operator+(Complex &m);
        Complex operator-(Complex &m);
        Complex operator*(Complex &m);
        friend ostream& operator<<(ostream & s, Complex &n);
};

//далее определяем функции
Complex::Complex(int x, int y)
{cout<<"Vvedite deistvitelnuu chast i mnimuu chast";
cin>>x>>y;
a=x;b=y;};
Complex::Complex()
{a=0;b=0;};
Complex Complex::operator+(Complex &m)// сумма 2ух комплексных чисел
{
Complex p;
p.a=a+m.a;
p.b=b+m.b;
return p;
};
Complex Complex::operator-(Complex &m)// произведение 2ух комплексных чисел
{
Complex p;
p.a=a-m.a;
p.b=b-m.b;
return p;
};
Complex Complex::operator*(Complex &m)// произведение 2ух комплексных чисел
{       
Complex p;
p.a=a*m.a-b*m.b;
p.b=a*m.b+b*m.a;
return p;
};
ostream & operator<<(ostream & s, Complex &n)
{
s<<n.a<<" + "<<n.b<<"i"<<endl;
return s;} ;
//наследование классов
class Chislo: public Complex //наследование класса//должен определить, комплексное это число или действительное (b=0||b!=0)
{
        public:  bool p;
        Chislo(int x, int y, bool q);
        Chislo(bool q);
        ostream &  operator<<(Chislo & t);
};
//функции-элементы
Chislo::Chislo(int x, int y, bool q):Complex(x,y)
{
        if(y=0) q=true;
        else
        q=false;
        p=q;
}
Chislo::Chislo(bool q):Complex()
{
        q=true; p=q;
}
ostream & operator<<(ostream & rr, Chislo & t)
{
        if(t.p=true)
         rr<<" deistvitelnoe ";
        else
        {rr<<" Complexnoe ";};  return rr;
}
#endif
в месте с if. кстати. почему-тоне работал оператор
выражение1?выражение2:выражение3, который аналогичен if else
и ещё в программе идёт ошибка:
Код:
#include <iostream.h>
#include "Complex1_.cpp"
main()
{        int x,y;bool p;
Chislo A(x,y,p);
Chislo B(x,y,p);
Chislo C(p);
C=A+B;//производный класс не пользуется операцией базового класса
cout<<C;

cin.get();
cin.get();
}
Dimarik вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование z3rg Общие вопросы C/C++ 9 30.04.2009 20:43
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
наследование методов TaTT DoGG Общие вопросы .NET 4 27.02.2009 01:27
Наследование Кирилл13 Общие вопросы C/C++ 1 11.11.2008 14:47
Классы и наследование. Scratch Общие вопросы C/C++ 9 27.09.2008 16:03