ele*_*der 0 c++ overriding storage-class-specifier
#include <iostream>
class A{
public:
void printit(register int b) {
std::cout<<"inside A";
}
};
class C:public A{
public:
void printit(int b) {
std::cout<<"inside C";
}
};
int main() {
C c;
c.printit(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,printit 是 C 中的一个重写方法,没有存储类寄存器。但是,编译器仍然匹配,并且代码打印“inside C”。为什么寄存器 int 与 int 匹配?
C++ 存储类从未参与过重载决议。这是出于显而易见的原因:存储类修改特定变量内存的来源/方式。重载解析与用于调用函数的表达式的性质有关。表达式并没有真正的存储类。
是的,表示具有存储类的变量的表达式可以说是具有存储类。但是表达式也可以是对变量的各种计算。或者字面意思。或者函数返回值。这些东西都没有存储类。
因此,虽然您可以声明参数使用register存储类(register在 C++ 中仍然是一个东西。C++11 不赞成使用该关键字,而 C++17 及更高版本正式删除了它),但这并没有t 意味着它参与了重载决议。它只影响所讨论的参数变量如何获取其内存(register当然,在 C++ 中,它具有任何行为)。
除此之外,如果您从基类继承并创建一个与基类方法同名的方法,则基类方法将无法访问,除非您使用using声明将它们带回来。因此,即使存储类以某种方式参与了重载解析,您的代码仍然无法工作。
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |