繁体   English   中英

派生类Private方法被调用

[英]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类中应该是privateprotected 这将迫使调用者使用接口,而不是实际的类型(当然,这并不总是实用的,但要考虑到这是一件好事)。

具体类型应按您的情况抽象出来。 base方法被声明为public并且您是通过指向base的指针来调用它的,因此允许它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM