[英]Derived class Private method is getting called
我有一个指向派生类对象的基类指针。 方法foo()在基类中是公共的,但在派生类中是私有的。 基类foo()是虚拟的。 因此,当我从基类指针调用foo()时,Vptr Table具有派生类foo()的地址,但它在派生类中是私有的...那么它怎么被调用。
我了解运行时多态性,也了解访问说明符在编译时有效,而虚拟概念在运行时有效。 因此,不会有编译器错误。
我的问题是:这是一个循环孔,通过它我们可以调用Derived类的私有方法? 或预期会以这种方式表现。 此行为的任何好的解释。
非常感谢。
代码:
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;
}
它是私有方法,但由于它是虚拟的,因此可以调用。
n3690 11.5 / 1
虚拟函数的访问规则(第11条) 由其声明确定,并且不受后来覆盖该函数的函数规则的影响。
为什么这个? 以来
n3690 11.5 / 2
在调用点使用用于表示为其调用成员函数的对象的表达式的类型(在上例中为B *)检查访问。 通常不知道在定义成员函数的类中访问成员函数的情况(上述示例中的D)。
访问级别是一个编译时概念。 运行时不知道方法是被声明为private
还是public
。 这些是为了您的方便。
这实际上是一个很好的编码标准- virtual
方法最好在基类中是public
,而在private
类中应该是private
或protected
。 这将迫使调用者使用接口,而不是实际的类型(当然,这并不总是实用的,但要考虑到这是一件好事)。
具体类型应按您的情况抽象出来。 base方法被声明为public
并且您是通过指向base的指针来调用它的,因此允许它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.