为什么这个子类的父方法调用不是多态的?

Chr*_*ton 5 oop polymorphism inheritance d

我最近一直在涉及Dlang,因为在使用Python这么长时间之后,C++并没有和我坐在一起.在涉足时,我遇到了我认为在多态中非常简单的练习.我想你最终用户可能无法理解的原因是你会期望某些东西能起作用,它实际上做的是两件完全不同的东西.话虽这么说,这是我的"sandbox.D"的源代码:

import std.stdio;

class Animal {
    string voice = "--silence--";
    void speak() {
        writeln(this.voice);
    }
}

class Dog : Animal {
    string voice = "Whoof!";
}

int main() {
    auto a = new Animal();
    auto d = new Dog();

    writeln(a.voice); // Prints "--silence--"
    writeln(d.voice); // Prints "Whoof!"

    a.speak(); // Prints "--silence--"
    d.speak(); // Prints "--silence--" NOT "Whoof!"

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想我的问题是为什么"this"关键字似乎没有按照C++后继语言的预期运行.

Ada*_*ppe 5

方法是多态的,变量不是.因此,不要让语音成为变量,而是想要override speak在孩子身上.

此外,auto返回类型不适用于多态,您需要实际指定类型.(原因是自动返回在编译器中创建了一个函数模板,理论上它可以在函数表中有多个可覆盖的插槽,因此它不会尝试将其放入.)

试试这个:

import std.stdio;

class Animal {
  void speak() { // changed to void instead of auto
    writeln("--silence--");
  }
}

class Dog : Animal {
  override void speak() { // the override tells it to override the base method
    writeln("woof");
  }
}

int main() {
    auto d = new Dog();
    d.speak();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你有很多共享功能并希望在子类中稍微改变时重用一个函数,那么你可以创建一个方法而不是只返回一些东西的变量.

就像string voice() { return "woof"; },那么它可以在儿童中被覆盖.

  • 它很有用,只需记住只有方法可以覆盖,变量不是.(我不确定它在Python中是否相同,但它通常在许多OOP语言中以这种方式工作).虽然,遗产确实有其局限性; 你可以用它解决很多问题,但并不总是最好的方法. (2认同)