首页 > 解决方案 > 是否保证基类的非虚拟方法可以通过派生类的对象使用?

问题描述

请考虑以下代码:

#include <iostream>

class Base {
public:
    void Print() { std::cout << "a\n"; }
};

class Derived : public Base {

};

int main() {
  Derived d;
  d.Print();
}

a它按预期打印。但是,我想确保这确实是对 C++ 的有效使用,并且我不会意外地遇到 UB。

派生类是否都继承了所有非虚方法?如果是这样,它们是否可以保证通过派生类的对象(或指向对象的指针)可用?

标签: c++inheritance

解决方案


从名称查找的角度来看,给定d.Print();的,名称Print将首先在Derived(的类型d)范围内检查而没有找到,然后在范围内检查Base,然后找到。之后,执行重载解析和可访问性检查,结果Base::Print()保证在这种情况下成功调用。virtual在这种情况下,它与方法无关。

名称查找如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。


推荐阅读