c++ - 多态性和数据隐藏 : Does a base class override or ignore a derived class' access restrictions?

标签 c++ oop inheritance

请看下面的代码 list :

#include <iostream>

using namespace std;

class Base {
public:
    virtual void Message() = 0;
};

class Intermediate : public Base {

};

class Final : public Intermediate {
    void Message() {
        cout << "Hello World!" << endl;
    }
};

int main() {
    Final final;
    /* Wont work (obviously):
    Final* finalPtr = &final;
    finalPtr->Message();
    */
    // Works:
    Intermediate* finalPtr = &final; // or Base* finalPtr = &final;
    finalPtr->Message();

    return 0;
}

注意以下事项:

  1. 在抽象Base类中,纯虚函数message()是public
  2. Intermediate 类(也是抽象的)继承自 Base 类(Does message() function remain public pure virtual in Intermediate?)
  3. Final 类继承自Intermediate 类并且message() 函数是私有(private)的(默认情况下)
  4. 在 main 中,创建了一个 Final 类型的对象
  5. 创建了一个指向Final对象的Intermediate指针

问题: 如果您运行该程序,行 finalPtr->Message(); 成功调用 Finalmessage() 函数实现强>私有(private)。这是怎么发生的?基类是否覆盖或忽略派生类的访问限制?

相关问题: 关于上面的 (2.),定义 Intermediate 类的正确方法是什么?是否需要从基类中重新声明纯虚函数 message() 并牢记 Intermediate 类并非旨在提供实现。

注意:代码已通过 Digital Mars Compiler (dmc) 和 Microsoft 的 Visual Studio Compiler (cl) 进行了测试,并且在两者中都运行良好

最佳答案

How does that happen? Does a base class override or ignore a derived class' access restrictions?

通过公共(public)继承,基类的所有公共(public)成员都成为派生类的公共(public)成员。所以是的 Message()Intermediate 中的公共(public)函数。

该函数在基类(中间)指针上调用,该函数在基类中是公共(public)的。动态调度(即对 Derived 类函数的实际调用)仅在运行时发生,因此有效。

以上是由于在运行时,访问说明符没有意义,访问说明符规则只在编译时解析和生效。

如果您在派生类指针上调用该函数,那么在编译时编译器会检测到 Message()Final 中被声明为 private因此它给出了错误。


从抽象类派生时,派生类必须所有基类的纯虚函数提供定义,否则将导致派生类也是一个抽象类。

这里的 Intermediate 类是一个抽象类,只要你不需要创建这个类的对象,它就可以正常工作。请注意,您可以创建指向抽象类的指针。

关于c++ - 多态性和数据隐藏 : Does a base class override or ignore a derived class' access restrictions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7709551/

相关文章:

javascript - JS : create a subclass instance from a superclass instance

c++ - 通过引用传递值到线程并修改

python - Python 中文件解析器的包装或继承

使用从抽象类继承的 C++ 默认构造函数

javascript - 使用 this 从嵌套函数内部获取值

c++ - 继承 Shell 类以供容器使用

接受派生类对象的派生类中的 C++ Enforce 函数

c++ - 创建线程时设置 CPU 亲和性

c++ - 从编译器的角度来看,传递 const 值或 const ref 之间的区别

c++ - 找不到 Magick++ 头文件