【发布时间】:2015-02-03 19:39:53
【问题描述】:
我对 C++ 中的虚函数主题有点困惑。 有没有总结所有可能情况的流程图?
例如:
class A {
public:
virtual void f(const int i) { cout << "A::f" << endl; }
};
class B : public A {
public:
// Hide A's f with new implementations
void f() { cout << "B::f" << endl; }
};
class C : public B {
public:
void f() { cout << "C::f" << endl; }
};
class D : public B { public:
void f(const int i) { cout << "D::f" << endl; }
};
void main() {
D d;
C c;
B* pb = &c;
pb->f();
A* pa = &d;
A* paa = &c;
pa->f(1);
paa->f(1); //in here C::f would be invoked?
}
在这种情况下,B 隐藏了A::f,并且C 具有对具有相同签名的B::f 的覆盖。
pb->f() 会调用C::f 吗?
pa->f(1) 会调用A::f 吗?
我要求它知道B::f 是否仍被认为是虚拟的,因此它的派生类可以覆盖它,尽管它隐藏了A::f。
如果 C::f 默认被认为是虚拟的?
【问题讨论】:
-
你的意思是一旦你隐藏了基础虚拟函数,隐藏函数默认不是虚拟的?
-
@Day_Dreamer 您可能还想在这里阅读:stackoverflow.com/questions/18198314/override-keyword-in-c