在C ++ public heritance Base Class中调用Derived类的私有虚函数

时间:2016-06-08 14:57:53

标签: c++ inheritance

我的代码:

#include <iostream>
using namespace std;
class Base
{
public:
    void print() { doPrint();}
private:
    virtual void doPrint() {cout << "Base::doPrint" << endl;}
};

class Derived : public Base
{
private:
    virtual void doPrint() {cout << "Derived::doPrint" << endl;}
};

int main()
{
    Derived *d = new Derived();
    Base* p = dynamic_cast<Base*>(d);
    p->print();
    delete d;
    return 0;
}

输出为Derived::doPrint,我不太清楚答案。为什么不Base::doPrint?在公共继承中,为什么Base类可以调用Derived类的私有虚函数?

3 个答案:

答案 0 :(得分:1)

在C ++中,访问检查是在表达式的静态(编译时)类型上完成的,但虚拟调用使用动态(运行时)类型。

在您的示例中,*p包含静态类型Base和动态类型Derived

答案 1 :(得分:0)

即使在您编写Base* p = dynamic_cast<Base*>(d);之后,p仍然是指向Derived实例的指针。

因此p->print();将调用Derived类上的函数。

这就是多态在C ++中的工作原理。

答案 2 :(得分:0)

虚拟会告诉它检查要调用的函数。它仍然知道它是Derived。如果你还没有放virtual这就不行了。阅读有关多态性的更多信息。