gpt4 book ai didi

c++ - 为什么程序会这样写输出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:15:23 31 4
gpt4 key购买 nike

我想知道为什么这个c++程序的输出是X:f1?有y对象的调用,调用Y的f1()是否合乎逻辑?不应该有遗产吗?我很困惑...

    class X {
public:
void f1() { cout<<"X:f1"<<endl;}
};
class Y : public X {
public:
void f1() { cout<<"Y:f1"<<endl;}
};
Y* y = new Y();
void f(X* x) { x -> f1(); }
int main () { f (y);
system("pause");
return 1;
}

以及如何更改 f() 函数的主体和在输出中获取 Y:f1 所需的参数?

最佳答案

因为 X::f1 不是 virtual,所以对它的调用是静态分派(dispatch)的,即在这种情况下,它们是基于 的静态类型分派(dispatch)的x(即 X)而不是它的动态类型(在本例中为 Y)。

换句话说,因为 X::f1 不是 virtual,所以 x 指向 的一个实例当您调用 f(y) 时 Y 未被考虑 - 编译器将对 X::f1 的所有调用分派(dispatch)给 Xf1 而不管 x 指向的对象的动态(即运行时)类型。

与其他语言(例如 Java)不同,C++ 中的成员函数在默认情况下不是虚拟的 - 您必须明确指定您希望子类能够覆盖它们。

要获得您期望的输出,您需要向 X::f1 添加一个 virtual 限定符 - 您无法仅通过更改f 的正文,因为您正在丢弃有关 x 动态类型的信息,但是您可以将 f 的参数更改为在这种特殊情况下接受 Y* 而不是 X*

关于c++ - 为什么程序会这样写输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654686/

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