Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 25, 2004 abstract bug? or my error? | ||||
---|---|---|---|---|
| ||||
--[bug.d]-- class A { abstract int x = 1; abstract static int y = 2; void foo() { printf("%d\n%d\n",x,y); } } class B : A { int x = 3; static int y = 4; void bar() { printf("%d\n%d\n",x,y); } } void main() { B b = new B(); b.foo(); b.bar(); } D:\D\src\build\temp>dmd bug.d d:\D\dmd\bin\..\..\dm\bin\link.exe bug,,,user32+kernel32/noi; D:\D\src\build\temp>bug 1 2 3 4 Shouldn't this print? 3 4 3 4 Regan. -- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
June 25, 2004 Re: abstract bug? or my error? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | Regan Heath wrote: > --[bug.d]-- > class A { > abstract int x = 1; > abstract static int y = 2; > void foo() { > printf("%d\n%d\n",x,y); > } > } > > class B : A { > int x = 3; > static int y = 4; > void bar() { > printf("%d\n%d\n",x,y); > } > } <snip> I guess in D, just like (I think) C++ and Java, member variables cannot be overridden. And so x and y defined in B are distinct members, which hide the identically named members in A. And since they don't override, foo only sees the x and y declared in A, while bar sees the ones declared in B. I'm not convinced that this should be allowed, unless the base class x and y are private. But I guess it's debatable. But I would certainly consider it a bug that the word 'abstract' is allowed here. To specify new initialisations for inherited members, use a constructor. Static members (functions or variables) don't override either AIUI. If you need this for some type identification or similar, use a non-static property instead. Stewart. -- My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment. Please keep replies on the 'group where everyone may benefit. |
June 25, 2004 Re: abstract bug? or my error? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Stewart Gordon | I should've said this is going to be my last post before I disappear off to Finland next week, if you hadn't picked up my post in digitalmars.D. Still, maybe someone else here can help you....
Stewart.
--
My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment. Please keep replies on the 'group where everyone may benefit.
|
June 25, 2004 Re: abstract bug? or my error? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Stewart Gordon | On Fri, 25 Jun 2004 19:42:18 +0100, Stewart Gordon <smjg_1998@yahoo.com> wrote: > I should've said this is going to be my last post before I disappear off to Finland next week, I feel honoured :) > if you hadn't picked up my post in digitalmars.D. Still, maybe someone else here can help you.... Thanks. Regan -- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
June 25, 2004 Re: abstract bug? or my error? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Stewart Gordon | On Fri, 25 Jun 2004 19:28:31 +0100, Stewart Gordon <smjg_1998@yahoo.com> wrote: > Regan Heath wrote: >> --[bug.d]-- >> class A { >> abstract int x = 1; >> abstract static int y = 2; >> void foo() { >> printf("%d\n%d\n",x,y); >> } >> } >> >> class B : A { >> int x = 3; >> static int y = 4; >> void bar() { >> printf("%d\n%d\n",x,y); >> } >> } > <snip> > > I guess in D, just like (I think) C++ and Java, member variables cannot be overridden. And so x and y defined in B are distinct members, which hide the identically named members in A. And since they don't override, foo only sees the x and y declared in A, while bar sees the ones declared in B. Ahh yes... I see there is no vtable for member variables only member functions. I can solve it by making a function for getting the variable. This occured to me just after posting this question. > I'm not convinced that this should be allowed, unless the base class x and y are private. But I guess it's debatable. In my actual problem they were private, but it seems to make no difference. > But I would certainly consider it a bug that the word 'abstract' is allowed here. Yeah.. if this isn't to be allowed something like the C++ error: 'virtual' not permitted on data declarations should be given. > To specify new initialisations for inherited members, use a constructor. That's another way to solve it, so now I have 2 choices. Thanks. > Static members (functions or variables) don't override either AIUI. If you need this for some type identification or similar, use a non-static property instead. This isn't what I need it for. RTTI would do this for me anyway, right? (I have not used it yet) Regan. -- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
Copyright © 1999-2021 by the D Language Foundation