digitalmars.D.bugs - abstract bug? or my error?
- Regan Heath (37/37) Jun 24 2004 --[bug.d]--
-
Stewart Gordon
(20/38)
Jun 25 2004
- Stewart Gordon (8/8) Jun 25 2004 I should've said this is going to be my last post before I disappear off...
- Regan Heath (7/11) Jun 25 2004 I feel honoured :)
- Regan Heath (16/47) Jun 25 2004 Ahh yes... I see there is no vtable for member variables only member
--[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/
Jun 24 2004
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.
Jun 25 2004
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.
Jun 25 2004
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/
Jun 25 2004
On Fri, 25 Jun 2004 19:28:31 +0100, Stewart Gordon <smjg_1998 yahoo.com> wrote:Regan Heath wrote: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.--[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.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/
Jun 25 2004