作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道为什么这个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)
时 YX::f1
的所有调用分派(dispatch)给 X
的 f1
而不管 x
指向的对象的动态(即运行时)类型。
与其他语言(例如 Java)不同,C++ 中的成员函数在默认情况下不是虚拟的
- 您必须明确指定您希望子类能够覆盖它们。
要获得您期望的输出,您需要向 X::f1
添加一个 virtual
限定符 - 您无法仅通过更改f
的正文,因为您正在丢弃有关 x
动态类型的信息,但是您可以将 f
的参数更改为在这种特殊情况下接受 Y*
而不是 X*
。
关于c++ - 为什么程序会这样写输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654686/
我是一名优秀的程序员,十分优秀!