关于c ++:派生类私有方法被调用

Derived class Private method is getting called

我有一个指向派生类对象的基类指针。方法foo()在基类中是公共的,但在派生类中是私有的。基类foo()是虚拟的。所以当我从基类指针调用foo()时,vptr表有派生类foo()的地址,但它在派生类中是私有的…那么如何调用它呢??

我了解运行时多态性,也了解访问说明符在编译时工作,虚拟概念在运行时工作。所以不会有编译错误。

我的问题是:这是一个循环孔,通过它我们可以调用派生类的私有方法吗?或者它应该这样做。对这种行为有什么好的解释吗?

提前多谢。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}


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

N36901.5/1< Buff行情> < P>虚拟函数的访问规则(第11条)由其声明决定,不受稍后重写函数的规则。

为什么会这样?自从

N36901.5/2< Buff行情> < P>在调用点使用用于表示对象的表达式类型检查访问。调用成员函数(在上面的示例中为b*)。中类中成员函数的访问它的定义(在上面的例子中是d)通常是未知的。


访问级别是编译时概念。运行时不知道方法是声明为private还是声明为public。这些是为了你的方便。

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

具体类型在您的案例中是抽象的,因为它应该是抽象的。基方法被声明为public,您通过指向基的指针来调用它,因此它是允许的。