在多重继承中存在二义性问题
我们来看第一类二义性问题:
- 派生类函数与基类函数重名问题:
class Fa
{
private:
int m;
public:
void print()
{
cout << "aaa" << endl;
}
};
class Stu1 :public Fa
{
public:
void print()
{
cout << "sss" << endl;
}
};
int main()
{
Stu1 s;
s.print();
return 0;
}
这个会导致程序阅读者造成歧义,但是本身程序迷人调用的是派生类的print()函数。
解决方法:
加上作用域解析符号
Stu1 s;
s.Fa::print();
2:菱形继承带来的歧义性问题
如果程序出现了这种,B,C继承了A,D继承了B,C这种问题,如果通过D我们调用A里面的成员函数,到底是通过路径A还是路径B呢?
这就造成了歧义
class A
{
public:
void fun()
{
cout << "A" << endl;
}
};
class B : public A
{
public:
void funb()
{
cout << "B" << endl;
}
};
class C :public A
{
void func()
{
cout << "C" << endl;
}
};
class D:public B,public C
{
public:
void fund()
{
cout << "D" << endl;
}
};
int main()
{
D d;
d.fun();
system("pause");
return 0;
}
解决方案1:
加上作用域解析符:
D d;
d.C:: fun();
d.B::fun();
方法2:虚基类
C++中为了允许程序中只有公共基类的一个副本,使得基类不产生多次拷贝,写入了虚基类。
class A
{
public:
void fun()
{
cout << "A" << endl;
}
};
class B : virtual public A
{
public:
void funb()
{
cout << "B" << endl;
}
};
class C :virtual public A
{
void func()
{
cout << "C" << endl;
}
};
class D:public B,public C
{
public:
void fund()
{
cout << "D" << endl;
}
};
int main()
{
D d;
d.fun();
d.C:: fun();
d.B::fun();
system("pause");
return 0;
}
这样就能解决二义性问题。