IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Наследование, С++
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


class b{
public:
b(int x){}
};
class a:b{
public:
a(int x)/*:b(x)*/{}//[C++ Error] Unit1.cpp(49): E2251 Cannot find default constructor to initialize base class 'b'
};
main(){}
Если надо сначала произвести какие-то действия над х в конструкторе а, и только потом его передать в конструктор b как надо действовать?

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Ну, ошибка у тебя - потому что дефолтного конструктора (без параметров) на самом деле нет. Напиши так:
class b
{
public:
b(int x = 0) {}
};
class a: b
{
public:
a(int x) {}
};
- ошибки не будет... Но это проблемы-то не решает, дефолтный конструктор предка все равно будет вызван ДО того, как начнет выполняться тело конструктора A. К тому же обрати внимание, у тебя тип наследования не указан, это означает, что будет выбрано наследование частное: class a : b равносильно class a : private b, а не class a : public b. Разницу между общим и необщим наследованием знаешь?

Теперь по твоему вопросу: в общем случае так не делается. Сначала инициализируется базовый класс, и только потом производятся все нужные действия. Можно поподробнее, задача в чем состоит? Наверняка есть более подходящий способ решения.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Есть математическое описание объекта. Нужно сделать его графическое представление. Объект реализуется в своей системе координат. Чтобы сделать поправку при старте хотел обработать входящий параметр. Т.к. фактически мне нужен один метод Draw наследника public не писал.
Разница между общим и необщим наследованием в том, что при общем поля public предка будут видны в наследнике, а иначе нет.
Обойти эту проблему просто: сделать поле с типом "предка", но "наследника" оставить без этого "предка".
А паскаль то позволяет!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Разница между общим и необщим наследованием в том, что при общем поля public предка будут видны в наследнике, а иначе нет.
Это только часть разницы, причем меньшая. Гораздо интереснее - что

1. Защищенное наследование: все public и protected члены/методы предка в потомке становятся protected-членами/методами.
class A
{
public:
int x; // Общий член
};

class B : protected A
{
// Вот тут x уже защищенный, а не общий
};


2. Частное наследование: все public и protected члены/методы предка в потомке становятся private-членами/методами, поэтому
class A
{
public:
A(int px) : x(px) {}
int x; // Общий член
};
class B: A /* или class B : private A */
{
// В этом классе x уже стал частным
public:
B(int x) : A(x) {}
};
class C : public B
{
public:
void test()
{
cout << x << endl; // В предке был частным - значит, тут нет доступа... Упс...
}
};



Цитата
Есть математическое описание объекта. Нужно сделать его графическое представление. Объект реализуется в своей системе координат. Чтобы сделать поправку при старте хотел обработать входящий параметр.

class Base
{
protected:
int x;
public:
Base(int px) : x(px)
{
cout << "Base creation : " << x << endl;
}
};
class Derived : public Base
{
public:
static Derived processBefore(int x);
private:
Derived(int x) : Base(x)
{
cout << "Derived creation" << endl;
}
};

inline Derived Derived::processBefore(int x)
{
cout << "Processing x" << endl; // Обрабатывай
return Derived(x);
}

int main()
{
Derived obj = Derived::processBefore(10);
return 0;
}

Угу?

Цитата
А паскаль то позволяет!
Опять похоливарить захотелось? smile.gif Не надо...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Чуть-чуть угу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 20:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name