派生类私有方法被调用

时间:2013-12-09 10:16:29

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

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

n3690 11.5 / 1

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

为什么这样?由于

n3690 11.5 / 2

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

答案 1 :(得分:2)

访问级别是编译时的概念。运行时不知道方法是否已声明privatepublic。这些都是为了您的方便。

这实际上是一个很好的编码标准 - virtual方法在基类中理想地应为public,在派生类中应为privateprotected。这将强制调用者使用接口而不是实际类型(当然,这并不总是实用,但考虑到这是一件好事。)

具体类型在您的情况下被抽象出来,应该如此。基本方法声明为public,你通过指向基类的指针调用它,所以它是允许的。