c++ - C++中公共(public)继承基类调用派生类的私有(private)虚函数

标签 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类的私有(private)虚函数?

最佳答案

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

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

关于c++ - C++中公共(public)继承基类调用派生类的私有(private)虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37706127/

相关文章:

c++ - 清除谷歌测试错误中的标准输出错误

c++ - 预测C++程序运行时间

java - 隐式 super 构造函数。必须显式调用另一个构造函数

python - 实例化从 cython 中的类派生的 C++ 结构

python 子类

java - 如何使用具有多列/复合主键(JPA 1.0 @IdClass)的表实现继承?

C++ 多重继承 + 虚函数(- 歧义)= 奇怪的行为(也是函数指针)

c++ - ATL 如何将 BSTR* str 转换为注册表项。SetValue(LPCTSTR str 类型

c++ - 任何类型的 unique_ptr 的 static_assert

c++ - enable_if'ed 模板化模板构造函数的类型签名?