gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:37:50 28 4
gpt4 key购买 nike

我最近一直在涉足 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;
}

我想我的问题是为什么“this”关键字似乎并没有像您期望的那样在 C++ 后继语言中发挥作用。

最佳答案

方法是多态的,变量不是。所以不要让声音成为一个变量,你想要 override speak在 child 。

另外,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;
}

如果您有很多共享功能,并且想要重用一个在子类中稍作更改的函数,您可以创建一个方法而不是一个只返回某些内容的变量。

string voice() { return "woof"; } ,那么它可以在 child 中被覆盖。

关于oop - 为什么这个子类的父方法调用不是多态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436506/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com