![]() |
![]() |
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 :))) |