К списку форумов К списку вопросов
(С++) инициализация конструктора родительского класса
AI
07.05.2004 - 09:55
к примеру в книге страуструпа пишеться не что такое в разделе о наследовании:
class A
{
public:
  int a;
  A(int i) { a= i;}
  A();
};
class B : public A
{
public:
  int b;
    B(int i,int j) : a(j) { b = i;}
};
в данном случай ругаеться компялятор на то что переменнеая a не член класса B - хотя идёт public;
конечно я могу сделать так
class A
{
public:
  int a;
  A(int i) { a= i;}
  A();
};
class B : public A
{
public:
  int b;
    B(int i,int j) : A(j) { b = i;}
};
но не понятно почему так происходит.
Сергей
1 - 07.05.2004 - 10:33
Ответ заключается в порядке инициализации данных объекта. Сначала инициализируются данные базового класса, затем его потомка, и так далее по иерархии наследования. Когда ты в потомке пытаешься инициализировать данные базового класса - ты на самом деле пытаешься произвести их повторную инициализацию, что далеко не всегда хорошо.
Наф
2 - 07.05.2004 - 10:42
a(j) ??? такой нет функции
AI
3 - 07.05.2004 - 10:45
ясненько. спасибо Сергей.
dvserg
4 - 08.05.2004 - 10:27
class B : public A
{
public:
  int b;
    B(int i,int j) : a(j) { b = i;}
                    ^^^^ этой функции у тебя нигде нет
    B(int i,int j) : a=0 { b = i;} // для паблик a можно так, насчет a=j таким образом - сомневаюсь
    B(int i,int j) : { a=j; b = i;} // или так
};
VaS
5 - 08.05.2004 - 12:51
4: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_Initializing_Member_Objects.asp
Наф
6 - 09.05.2004 - 00:16
[5] Это не совсем согласуется с [0]. В примере Вашей ссылки объект включает в себя объекты как члены, а здесь имеем наследование.
dvserg
7 - 09.05.2004 - 19:08
To[4]
Конечно, никто не отменял стандартный способ
class B : public A
{
public:
  int b;
    B(int i,int j) : A(j) { b = i;}
};
Но он уже приведен в [0]
VaS
8 - 09.05.2004 - 22:05
7: Что я хотел сказать. Судя по твоемУ:
B(int i,int j) : a(j) { b = i;}
                 ^^^^ этой функции у тебя нигде нет
ты не понимаешь, что a(j) - не функция.
MatriXakep
9 - 09.05.2004 - 23:22
2dvserg: a(j) - это инициализация переменной a. т.е. a = j;
а A(j) - это уже функция конструктор!
dvserg
10 - 10.05.2004 - 11:24
2 MatriXakep сори - торможу
Вот скомпилилось только такое
class A {
public:
   int a;
   A() {a=0;};
   A(int x) {a=x;};
};
class B :public A {
public:
   int b;
   B(int x, int y) : A(x), b(y) {a=x;};
// B(int x, int y) : b(y) {a=x;}; // компилится только при наличии конструктора A() по-умолчанию
};
При попытке компилить
B(int x, int y) : A(x), a(y) {a=x;}; или
B(int x, int y) : A::a(y) {a=x;};
выдает, что 'A::a' не однозначный базовый класс 'B'
Cool Ace
11 - 11.05.2004 - 09:54
dvserg, почитай Страуструпа, поймешь, почему так.
MatriXakep
12 - 11.05.2004 - 17:31
dvserg% Я не вижу смысла в этих строках
B(int x, int y) : A(x), b(y) {a=x;};
B(int x, int y) : A(x), a(y) {a=x;};
B(int x, int y) : A::a(y) {a=x;};
Здесь переменная а 2 раза инициализируется а кому это нужно?
В общем последуй совету Cool Ace :)))

К списку вопросов на форуме Программирование

>>