D 通过超类操作子类时,值会发生变化

D 通过超类操作子类时,值会发生变化,d,D,我遇到了一个奇怪的问题。 当将子类传递给接受超类的方法时(这是可以的,因为子类是超类),子类的变量似乎会改变。。。 举一个更明确的例子: import std.stdio; void main () { SuperClass myspc = new SuperClass(); showSupID(myspc); // shows 0, ok SubClass mysbc = new SubClass(); showSupID(mysbc); // shows

我遇到了一个奇怪的问题。 当将子类传递给接受超类的方法时(这是可以的,因为子类是超类),子类的变量似乎会改变。。。 举一个更明确的例子:

import std.stdio;

void main () {
    SuperClass myspc = new SuperClass();
    showSupID(myspc); // shows 0, ok

    SubClass mysbc = new SubClass();
    showSupID(mysbc); // shows 0 again, wtf ?

    showSubID(mysbc); // shows 3, ok
}

class SuperClass {
    int id;
}

class SubClass : SuperClass {
    int id = 3;
}

void showSupID(SuperClass object){
    writeln(object.id);
}

void showSubID(SubClass object){ // I want to avoid to have subclass specific methods
    writeln(object.id);
}
在我的代码中,我想通过使用它们与超类的关系来集中所有类型的子类的操作。这种奇怪的行为对我来说是个大问题

我忘了什么吗?问题出在哪里?


谢谢。

变量不是多态的
超类
有一个名为
id
的变量,
子类
有一个名为
id
的不同变量,
子类
是从
超类
派生出来的,因此它也可以访问
超类
id
,但只有当它显式访问它时才可以(例如,通过
super.id
子类
中的代码)。由于
id
不是多态的,访问它时获得的
id
取决于用于访问它的引用的类型。如果引用的类型是
超类
,则访问的是
超类
id
,而如果引用的类型是
子类
,则访问的是
Sub类
id
,可访问

如果您想要多态行为,您必须使用
public
protected
函数。变量从来都不是多态的。

让我再提一下属性,它似乎也属于这里:)