Derived class Private method is getting called
我有一个指向派生类对象的基类指针。方法foo()在基类中是公共的,但在派生类中是私有的。基类foo()是虚拟的。所以当我从基类指针调用foo()时,vptr表有派生类foo()的地址,但它在派生类中是私有的…那么如何调用它呢??
我了解运行时多态性,也了解访问说明符在编译时工作,虚拟概念在运行时工作。所以不会有编译错误。
我的问题是:这是一个循环孔,通过它我们可以调用派生类的私有方法吗?或者它应该这样做。对这种行为有什么好的解释吗?
提前多谢。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class A { public: virtual void foo() { std::cout <<"In A"; } }; class B:public A { private: void foo() { std::cout <<"In B ??? Its Private Method :-("; } }; int main() { A* ptr = new B(); ptr->foo(); return 0; } |
它是私有方法,但由于它是虚拟的,所以可以调用它。
N36901.5/1< Buff行情> < P>虚拟函数的访问规则(第11条)由其声明决定,不受稍后重写函数的规则。
为什么会这样?自从
N36901.5/2< Buff行情> < P>在调用点使用用于表示对象的表达式类型检查访问。调用成员函数(在上面的示例中为b*)。中类中成员函数的访问它的定义(在上面的例子中是d)通常是未知的。
访问级别是编译时概念。运行时不知道方法是声明为
private 还是声明为public 。这些是为了你的方便。这实际上是一个很好的编码标准——
virtual 方法在理想情况下应该是基类中的public ,在派生类中应该是private 或protected 。这将强制调用者使用接口,而不是实际类型(当然,这并不总是实际的,但需要考虑的是一件好事)。具体类型在您的案例中是抽象的,因为它应该是抽象的。基方法被声明为
public ,您通过指向基的指针来调用它,因此它是允许的。