【发布时间】:2019-11-26 13:18:35
【问题描述】:
我无法理解孙子 (D) 如何覆盖隐藏的(通过 C::f2(A&) 方法 (B::f2(A))。
这是一个示例代码:
class B{
public:
virtual void f2(A a){cout<<"B::f2()"<<endl;}
};
class C:public B{
private:
public:
virtual void f2(A& a){cout<<"C::f2(A&)"<<endl;
}
};
class D:public C{
public:
void f2(A a){cout<<"D::f2(A)"<<endl;}
};
int main(void)
{
B* b = new D();
A a2 = A();
A &a = a2;
b->f2(a); // prints D::f2 - should'nt it print B::f2??
C* c = new D();
c->f2(a); // prints C::f2 - as expected
return 0;
}
【问题讨论】:
-
检查这个:stackoverflow.com/questions/7098054/…。
D::f2实际上是一个虚拟并覆盖B::f2 -
但是 C::f2 隐藏了 B::f2。
-
不,它不会隐藏它。是什么让你认为它隐藏了它?
-
虚函数覆盖的规则根本不考虑可见性。 (或访问:您也可以覆盖基类的虚拟私有函数。)不确定您在寻找什么其他类型的“为什么”。
-
@LightnessRacesinOrbit 当然。查找
b->f2找到B::f2并调用它的最终覆盖器D::f2。查找c->f2会找到C::f2,这是它自己的最终覆盖。
标签: c++ inheritance overriding virtual