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);