class base1
{
public:
void printing()
{
cout << "Using base1" << endl;
}
};
//base2 has a private version printing function
class base2
{
void printing()
{
cout << "Using base2" << endl;
}
};
class derived :public base1, base2
{
};
int main()
{
derived* d = new derived();
d->printing();
}
IDE 告诉我该调用不明确,因为“C++ 在确定名称解析时不考虑函数的访问说明符。”
这似乎与我在这里读到的内容相冲突:https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions
详细来说,重载决策通过以下步骤进行:
构建候选函数集。
将集合修剪为仅可行的函数。
分析该集合以确定单个最佳可行函数(这可能涉及隐式转换序列的排名)。
所以,这里的“可行”只是意味着某种类型检查,但它不会考虑该函数是否可访问甚至
=delete
'd?
所以,这里的“可行”仅意味着某种类型检查,但它不会考虑该函数是否可访问甚至=删除?
是的,两者与函数对于函数调用是否“可行”无关。该术语是一个技术术语,您不应仅根据其在一般英语中的含义来假设其含义。 但是,在您的情况下,甚至不是重载解析导致由于模糊性而导致失败,而是在此之前的一步。在重载解析之前,有一个名称查找来找出
d->printing
的名称。它可以是函数或函数模板的重载集,或者例如成员变量(可能有
operator()
)。名称查找本身已经是不明确的,因为名称是在多个基类中找到的。您甚至没有进入考虑函数调用的重载解析方面。