首页 文章

派生类私有方法被调用

提问于
浏览
1

我有一个指向派生类对象的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 回答

  • 6

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

    n3690 11.5 / 1

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

    为什么这个?以来

    n3690 11.5 / 2

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

  • 2

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

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

    具体类型在您的情况下被抽象出来,应该如此 . 基本方法声明为 public ,您允许're calling it through a pointer to a base, so it' .

相关问题