Thread overview
abstract bug? or my error?
Jun 25, 2004
Regan Heath
Jun 25, 2004
Stewart Gordon
Jun 25, 2004
Stewart Gordon
Jun 25, 2004
Regan Heath
Jun 25, 2004
Regan Heath
June 25, 2004
--[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
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
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
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
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/