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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 00:13   #1
GartesK
 
Регистрация: 13.11.2011
Сообщений: 4
По умолчанию Вопрос по множественному наследованию классов с++

Добрый вечер, собственно сидел разбирался с наследованием классов и наткнулся на такую пренеприятнейшую штуку: программа в конце выполнения закрывается с ошибкой, чтото вроде "программа *.exe не работает и будет закрыта, приносим извинения за неудобства". Проблема возникла после попытки реализации класса с 2 базовыми классами, причем видно что все данные которые должны выводиться - выводятся. Собственно сам думаю что проблема почемуто с деструктором последнего класса (его в явном виде не писал). Вот кусок кода с описание того класса:
Код:
class Square : public Rectangle, public Rhomb
{
public:
	Square():Rectangle(),Rhomb(){}
	Square(double x1t, double y1t, double x2t, double y2t, double x3t, double y3t, double x4t, double y4t):Rectangle(x1t,y1t,x2t,y2t,x3t,y3t,x4t,y4t),Rhomb(x1t,y1t,x2t,y2t,x3t,y3t,x4t,y4t){}
	double Perim()
	{
		return Rectangle::Perim();
	}
	double Area()
	{
		return Rectangle::Area();
	}
	void Transfer(double xt, double yt)
	{
		Rectangle::Transfer(xt,yt);
	}
	void Turn(double rt)
	{
		Rectangle::Turn(rt);
	}
	void PrintInfo()
	{
		cout<<endl<<"***Figure info***"<<endl<<"Square "<<endl;
		for (int i=1; i<=4; i++)
			cout<<"T["<<i<<"]=("<<Rectangle::T[i].x<<","<<Rectangle::T[i].y<<") "<<endl;
	}
	void FigureClass()
	{
		cout<<endl<<"***Figure class - Square***"<<endl;
	}
};

И да, забыл написать, что члены-данные *T наследуются обоими базовыми классами из своего общего базового класса

Доступ во всей иерархии public, спецификатор *T - protected

Последний раз редактировалось GartesK; 14.11.2011 в 00:18.
GartesK вне форума Ответить с цитированием
Старый 14.11.2011, 10:55   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

ну по видимому у вас классическая ошибка связанная с "ромбовым" наследованием. Если у вас Т наследуется от обеих базовых классов то компилятор не сможет однозначно ответить на вопрос к какому Т вы обращаетесь короче у него сейчас есть 2 экземпляра Т первый от Rectangle второй от Rhomb!
Что бы избежать этого для наследования классов Rectangle и Rhomb от класса (например)"Figure" используйте виртуальное наследование
Код:
class Rectangle : public virtual Figure{...};
class Rhomb : public virtual Figure{...};
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!

Последний раз редактировалось artush1984; 14.11.2011 в 11:08.
artush1984 вне форума Ответить с цитированием
Старый 14.11.2011, 13:32   #3
GartesK
 
Регистрация: 13.11.2011
Сообщений: 4
По умолчанию

а как при этом будут вести себя конструкторы? ошибка исчезла но теперь вместо конструктора с параметром всегда вызывается конструктор по умолчанию, т.е. если к примеру в теле программы написать
Код:
Square c(1,1,1,2,2,2,2,1);
то все равно вызовется конструктор по умолчанию, задающий все координаты нулевыми
GartesK вне форума Ответить с цитированием
Старый 14.11.2011, 14:32   #4
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

http://www.devdoc.ru/index.php/conte...nheritance.htm

Думаю вам будет полезно почитать эту статью
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 14.11.2011, 15:12   #5
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Код:
class Figure
{
public:
	Figure(){std::cout << "Figure()" << std::endl;}
	Figure(int a):_a(a){
		std::cout << "Figure(int a)" << std::endl;
	}
	int _a;
};
//================================================================

class Rectangle : public virtual Figure
{
public:
	Rectangle() : Figure () {std::cout << "Rectangle()" <<std::endl;}
	Rectangle(int a) :  Figure(a){
		std::cout << "Rectangle(int a)" << std::endl;
	}
};
//================================================================

class Rhomb : public virtual Figure
{
public:
	Rhomb() : Figure () {std::cout << "Rhomb()" <<std::endl;}
	Rhomb(int a) : Figure(a){
		std::cout << "Rhomb(int a)" << std::endl;
	}
};
//================================================================

class Square : public Rectangle, Rhomb
{
public:
	Square() : Rectangle(),Rhomb(){ std::cout << "Square()" << std::endl; }
	Square(int a):Figure(a),Rectangle(a),Rhomb(a) {
		std::cout << "Square(int a)" << std::endl; 
	}
};
//================================================================

int main( int argc, char** argv)
{
	Square a(5);
	std::cout << a._a << std::endl;
	system("PAUSE");
	return 0;
}
//===================================================================
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 14.11.2011, 16:42   #6
GartesK
 
Регистрация: 13.11.2011
Сообщений: 4
По умолчанию

Спасибо большое, наконец нашел ошибку, оказывается косяк мой был здесь, в описании конструктора с параметром, я не указывал что он является потомком класса "Figure":
Цитата:
Сообщение от artush1984 Посмотреть сообщение
Код:
Square(int a):Figure(a),Rectangle(a),Rhomb(a) {...}
а статью еще после Вашего первого поста прочитал
GartesK вне форума Ответить с цитированием
Старый 14.11.2011, 18:49   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Код:
		for (int i=1; i<=4; i++)
А здесь ошибки точно нет? )
Son Of Pain вне форума Ответить с цитированием
Старый 14.11.2011, 22:00   #8
GartesK
 
Регистрация: 13.11.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Код:
		for (int i=1; i<=4; i++)
А здесь ошибки точно нет? )
ну лучше наверное было бы с 0 поставить счетчик, но тут тоже работает корректно как ни странно
GartesK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Вопрос С++: Наследование] Создание пустых классов. MooNDeaR Помощь студентам 10 12.08.2011 15:59
диаграмма классов vep Фриланс 1 19.06.2011 16:58
задача по наследованию в С++ Евгений1221 Помощь студентам 1 12.05.2011 01:13
Вопрос по наследованию katbka Помощь студентам 0 13.05.2010 18:31
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18