我有一个指向派生类对象的Base类指针 . 方法foo()在基类中是公共的,但在派生类中是私有的 . 基类foo()是虚拟的 . 因此,当我从Base类指针调用foo()时,Vptr Table具有派生类foo()的地址,但它在Derived类中是私有的...所以如何调用它 .
我理解运行时多态性,我也理解Access说明符适用于编译时,虚拟概念在运行时工作 . 所以应该没有编译器错误 .
我的问题是:这是一个循环漏洞,通过它我们可以调用派生类的私有方法吗?或者预计会以这种方式行事 . 对此行为有任何好的解释 .
非常感谢提前 .
代码:
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;
}
2 回答
它是私有方法,但由于它是虚拟的 - 它可以被调用 .
n3690 11.5 / 1
为什么这个?以来
n3690 11.5 / 2
访问级别是编译时的概念 . 运行时不知道方法是否声明为
private
或public
. 那些是为了您的方便 .这实际上是一个很好的编码标准 -
virtual
方法在基类中理想地应该是public
,在派生类中应该是private
或protected
. 这将强制调用者使用接口而不是实际类型(当然,这并不总是实用,但需要考虑的好事) .具体类型在您的情况下被抽象出来,应该如此 . 基本方法声明为
public
,您允许're calling it through a pointer to a base, so it' .