C++函数二义性问题,我怎么感觉编译器有偷懒嫌疑!!!

瞎扯一段,讲得不一定对。纯属学习!

struct BB
{
void a(){
cout << "bb's a() ";
}
};

struct B1 : public BB
{
};

struct B2 : public BB
{
};

struct CC : virtual public B1,public B2
{
CC()
{

 a(); // 调用a函数,编译不过,需这样调B1::a();B2::a();BB::a();

}
};

在上述代码中,struct CC的构造里调用a()函数会产生所谓的二义性。好吧,事实就是这样。在此瞎扯一段,在这个实例里,如果编译器足够聪明,这里本不该产生二义性才对。因为这个函数并没有什么“真正的继承”问题,B1和B2里也没有覆盖定义a()函数。如果覆盖了,调用时要加限定符,不然会产生二义性,这我还能理解。但仅是这个例子中,假设编译器允许它编译成功,真的会有二义性吗?会产生调用错误吗?我觉得没有。所以我瞎讲一下,编译器有偷懒嫌疑。现在的编程都是朝着越来越精简的方向走了,没有用的语法限制只会带来麻烦。好吧,以前几乎不用多继承,我一直凭直觉以为这种情况下直接调a()不会有问题,现在涨下知识。以上就是粗略见解,讲得不好不对请原谅!

原文地址:https://www.cnblogs.com/openlib/p/5361205.html