私有非虚拟基类函数被称为派生类中的函数

Private non-virtual Base class function is called instead of the one in Derived class

本文关键字:派生 函数 被称为 类函数 虚拟 基类      更新时间:2023-10-16
class Base{
public:
    void callF(){ F(); }
private:
    void F(){}
};
class Derived: public Base{
public:
    void F(){}
};
int main(){
    Derived d;
    d.callF();
}

对我来说,base f()被调用。我不明白为什么。f()在基类中声明并定义为私有,因此派生的对象甚至都不知道基本中这种函数的存在。派生类有自己的F(),但该功能被忽略。问题是"为什么要拨打F()基类?"。

它是这样的。

  1. 调用Base::callF功能。它是公开的,因此将其称为forom main
  2. 没有问题
  3. Base::callF功能要调用名为F的函数。Base::callF可见的唯一FBase::F。它是私人的,但是callFBase的成员,因此它可以看到并使用所有其他成员,包括私人成员。
  4. Derived::F函数与此功能无关。这只是与Base::F无关的另一个功能,恰好具有相似的名称。

我不确定是否回答您的问题

问题是"为什么f()为何呼叫?"。

那是因为在派生类中只能覆盖virtual函数(动态多态性 1 ),除非您使用CRTP(静态多态性 1 ):

template<class Derived>
class Base{
public:
    void callF(){ static_cast<Derived*>(this)->F(); }
private:
    void F(){}
};
class Derived: public Base<Derived>{
public:
    void F(){}
};

否则

    void callF(){ F(); }

等于

    void callF(){ Base::F(); }

1)另请参见编译时间多态性和静态绑定之间有什么区别?