派生类私有方法被调用

Bir*_*rah 1 c++ ooad

我有一个指向派生类对象的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;
}
Run Code Online (Sandbox Code Playgroud)

For*_*veR 6

它是私有方法,但由于它是虚拟的 - 它可以被调用.

n3690 11.5/1

虚函数的访问规则(第11条)由其声明确定,并且不受稍后覆盖它的函数规则的影响.

为什么这个?以来

n3690 11.5/2

使用表达式的类型在调用点检查访问,该表达式用于表示调用成员函数的对象(上例中的B*).成员函数在其定义的类中的访问(上例中的D)通常是未知的.