Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 协方差和隐藏在C++;_C++_Covariance - Fatal编程技术网

C++ 协方差和隐藏在C++;

C++ 协方差和隐藏在C++;,c++,covariance,C++,Covariance,有人能解释一下每行输入的原因吗 Class A { bool f(A* a) { return true; } } class B : public A { bool f(B* b) { return false; } } void f() { A* a = new A(); A* ab = new B(); B* b = new B(); a->f(a); a->f(ab); a->f(b); // true, true, true ab->f(a); ab->f

有人能解释一下每行输入的原因吗

Class A {
bool f(A* a) { return true; }
}
class B : public A {
bool f(B* b) { return false; }
}
void f() {
A* a = new A();
A* ab = new B();
B* b = new B();
a->f(a); a->f(ab); a->f(b); // true, true, true
ab->f(a); ab->f(ab); ab->f(b); // true, true, true
b->f(a); b->f(ab); b->f(b); // error, error, false
}

B
有两个同名的非虚方法:
boolf(A*)
boolf(B*)

通常,这些都是过载;但由于一个是从基类继承的,所以它被基类隐藏。它仍然可以访问,只是需要一些特殊的语法来调用它,例如:

B b;
B* param;
b.f(param);    // calls B::f(B*)
b.B::f(param); // same
b.A::f(param); // calls the hidden A::f(A*)

因此:

这一点很简单:
a
a*
类型,因此将调用
a::f(a*)
,类型为
B*
的参数将转换为
a*

同样的情况也会发生,因为
ab
也是
A*
类型

因为
b
属于
b*
类型,而
b->f
只能引用
b::f(b*)
A::f
隐藏)。无法将
A*
隐式转换为
B*

但是,您可以明确提到隐藏方法:

b->A::f(A);b->A::f(ab)

最后一项工作,只需调用
B::f(B*)


备注:

在这里,函数是否是虚拟的并不重要。它们有不同的参数类型,所以一个不能覆盖另一个。一个只能隐藏另一个


C++允许协变返回类型(如果参数匹配,您可能希望在
A
中使用
virtual A*foo()
,在
B
中使用
virtual B*foo()
)。C++不允许共变或逆变参数类型。

不,因为这不是C++代码,对不起:这将不编译。至少在C++中,你没有注意到这里的内容,我在谈论C++中的概念而不是语法,而当你的人投票时,我试图帮助。好了,继续工作。@nabil我很高兴我理解了你的问题,但事实是,如果你发布可编译代码,你通常会更快地得到帮助。请下次再来。谢谢你的详细回答
a->f(a); a->f(ab); a->f(b);
ab->f(a); ab->f(ab); ab->f(b);
b->f(a); b->f(ab);
b->f(b);