Инициализация базового класса в С++.

Рубрика: C++, Дата: 29 March, 2013, Автор:
Tags:

Здорова!

У меня щас возникли ошибки и неоднозначности по поводу инициализации базового класса из производного класса. Например решая задачку по созданию Простой графической системы: http://www.kselax.ru/2013/03/prostaya-graficheskaya-sistema/ я наткнулся на следующую, толи ошибку, толи нипонятку.

От я допустим из базового класса Line вызываю конструктор в конструкторе Line::Line() просто вызовом Shape(); И чо вы думаете обращаюсь к открытым элементам класса Shape, а они у меня оказываются не инициализированы да как же мне их инициализировать? Я как то всегда думал, что вызвав просто конструктор базового класса, я его инициализировал, но фиг там. И так пытаемся разобраться.

Я уже разобрался со своей ошибкой. Моя ошибка состояла в том, что я вызвал конструктор базового класса явно в самом конструкторе производного класса, поэтому оно не сработало, не инициализировало класс, а мб просто создало еще один класс. Нужно было использовать инициализаторы класса. Приведу простой пример:

//inicializaci9 bazovogo klacca
#include <iostream>
using std::cout;
using std::endl;

class Shape
{
public:
	int a;
	int b;
	//konctryktor po ymolchaniyu pyctoi
	Shape(){}
	//konctryktor
	Shape(int a1,int b1):a(a1),b(b1){}
};

class Line : public Shape
{
	int a2;
	int b2;
public:
	Line(int a1,int b1)
	{
		Shape(a1,b1);
		cout <<"konstr"<<endl;
		a2=a1;
		b2=b1;
	}
	
	void print()
	{
		cout <<"a2= "<<a2<<" b2= "<<b2<<" a= "<<a<<" b= "<<b<<endl;
	}
};

int main()
{
	Line m(3,4);
	m.print();
	
	return 0;
}

Это отак я делал. Естественно я элементы базового класса так и не инициализировал. Они у меня так и остались нулевыми.

Как же нужно правильно делать? Щас я вам опять постараюсь привести простой примерчик:

//inicializaci9 bazovogo klacca
#include <iostream>
using std::cout;
using std::endl;

class Shape
{
public:
	int a;
	int b;
	//konctryktor po ymolchaniyu pyctoi
	//Shape(){}
	//konctryktor
	Shape(int a1,int b1):a(a1),b(b1){}
};

class Line : public Shape
{
	int a2;
	int b2;
public:
	Line(int a1,int b1)
	:Shape(a1,b1)
	{
		//Shape(a1,b1);
		cout <<"konstr"<<endl;
		a2=a1;
		b2=b1;
	}
	
	void print()
	{
		cout <<"a2= "<<a2<<" b2= "<<b2<<" a= "<<a<<" b= "<<b<<endl;
	}
};

int main()
{
	Line m(3,4);
	m.print();
	
	return 0;
}

Как мы видим так нужно правильно инициализировать базовый класс.

И еще вам скажу, что я подметил, от если мы в базовом классе создаем конструктор, любой кроме конструктора по умолчанию, то компилятор требует обязательно создать и конструктор по умолчанию, видимо он вызывает его из производного класса, а если нету вообще в базовом классе ни одного конструктора, то тогда все норм работает, никто ничего не требует. Отакие дела.

Так что инициализировать конструктор базового класса можно токо с помощью инициализаторов, и не то что можно, а нужно даже. Строго обязательно нужно, либо создать по умолчанию конструктор, чтобы он уже сам вызвался.

Я надеюсь вы поняли, что я хотел сказать, хотя так мало чо поймете, я тоже читал ничо не понял пока на практике не столкнулся. От понадобится вам про инициализировать базовые элементы тада вы поймете, что к чему. Ну ладно удачи!

rss