我有一个看起来像这样的类:
class ClassA
{
public:
float Get(int num) const;
protected:
float& Get(int num);
}
Run Code Online (Sandbox Code Playgroud)
在课外,我调用了Get()函数.
float foo = classAInstance.Get(i);
Run Code Online (Sandbox Code Playgroud)
我希望这可以调用公共版本,但是Visual Studio会出错:
error C2248: 'ClassA::Get' : cannot access protected member declared in class 'ClassA'
Run Code Online (Sandbox Code Playgroud)
在注释掉受保护的重载并删除对它的所有引用时,代码将编译.
为什么编译器在可访问的成员可用时尝试使用不可访问的成员?是否有一种可以接受的方法来强制编译器选择正确的重载?在某处有成员函数的解决规则吗?
演示:
#include<iostream>
struct A { int i = 10; };
struct B : A { };
int main(){
std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
<< std::is_same<decltype(&B::i), int A::*>::value << '\n'; //#1
A a;
std::cout << a.*(&A::i) << '\n';
std::cout << "decltype(&B::i) == int B::* ? "
<< std::is_same<decltype(&B::i), int B::*>::value << '\n'; //#2
B b;
std::cout << b.*(&B::i) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
代码打印
decltype(&B::i) == int A::* ? true
10
decltype(&B::i) == int B::* ? false …
Run Code Online (Sandbox Code Playgroud)