【问题标题】:In C++ public heritance Base Class call Derived class's private virtual fuctionC++公共继承基类调用派生类的私有虚函数
【发布时间】:2016-10-08 22:27:36
【问题描述】:

我的代码:

#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类的私有虚函数?

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

在 C++ 中,访问检查是对表达式的 static(编译时)类型进行的,但虚拟调用使用 dynamic(运行时)类型。

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

【讨论】:

    【解决方案2】:

    Virtual 会告诉它检查要调用的函数。它仍然知道它是一个Derived。如果您没有输入virtual,这将不起作用。阅读有关多态性的更多信息。

    【讨论】:

    • 谢谢,virtualprivate 不相关。我现在看得很清楚。
    【解决方案3】:

    即使你写了Base* p = dynamic_cast&lt;Base*&gt;(d);p 仍然是一个指向Derived 实例的指针。

    所以p-&gt;print(); 将调用Derived 类上的函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-16
      • 2015-02-21
      • 2011-01-08
      • 2017-04-14
      • 2021-10-22
      • 2021-11-02
      • 2018-05-19
      相关资源
      最近更新 更多