c++ - 是否保证基类的非虚拟方法可以通过派生类的对象使用?
问题描述
请考虑以下代码:
#include <iostream>
class Base {
public:
void Print() { std::cout << "a\n"; }
};
class Derived : public Base {
};
int main() {
Derived d;
d.Print();
}
a
它按预期打印。但是,我想确保这确实是对 C++ 的有效使用,并且我不会意外地遇到 UB。
派生类是否都继承了所有非虚方法?如果是这样,它们是否可以保证通过派生类的对象(或指向对象的指针)可用?
解决方案
从名称查找的角度来看,给定d.Print();
的,名称Print
将首先在Derived
(的类型d
)范围内检查而没有找到,然后在范围内检查Base
,然后找到。之后,执行重载解析和可访问性检查,结果Base::Print()
保证在这种情况下成功调用。virtual
在这种情况下,它与方法无关。
名称查找如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。
推荐阅读
- r - 如何修复“$ 运算符对原子向量无效”/正确加载数据集?
- angularjs - 如何使用 ng-click AngularJS 直接更新字段
- node.js - 返回html时获取双引号
- codeigniter - 添加 database.sql /docker-entrypoint-initdb.d/database.sql
- apache-kafka - 如何实现幂等KafkaProducer的回退?
- git - 在重构期间拆分文件时跟踪文件与 git 一起移动
- python - 如何在“matplotlib”中只找到波中的大峰
- gdb - 为什么设置断点并运行失败(第 2 章 shellcoder 手册)
- c# - 允许您更改 MS Teams 的默认帐户的脚本
- c# - 运行多个存储过程的最佳方法是什么?