一个关于C++多继承的问题
发布网友
发布时间:2022-06-20 20:43
我来回答
共3个回答
热心网友
时间:2024-11-17 09:59
楼主理解的概念有问题,虚继承的作用并不是为了区分不同父类之间的重名函数,
而是为了解决多重继承中菱形继承的二义性问题。
而按照楼主的意思,不同父类里的同名函数的继承,
不管是不是虚继承都会产生二义性,编译器会提示访问不明确。
如
class A
{
public:
int data;
void test()
{
printf("TEST A\n");
}
};
class B
{
public:
int data;
void test()
{
printf("TEST B\n");
}
};
class C :public A,public B
{
};
C theC;
theC.test();//存在二义性
A* p = new C;
p->test();//这样的情况p是A类指针,所以可以调用到A中的test.
正确的做法应该是在调用的时候指明被调用的函数的作用域,是属于类A还是类B。
或者是在子类中再次定义一个该名称的函数,对父类的函数构成隐藏或者覆盖。
楼主可以参考下C++中 重载覆盖和隐藏 规则。
数据的处理同样是这样。
不论名称是否相同,数据是实际存在于内存中的,只是访问的方式不能被编译器识别,所以不能正常访问到。
热心网友
时间:2024-11-17 09:59
如果不显示指定,会存在词法二义性。编译报错。
热心网友
时间:2024-11-17 09:59
是否是virtual继承都没关系,像你这样多个父类具有同名函数或成员时,子类在调用时必须指明函数来自于哪个类,否则翻译器将报错的,告诉你含糊不清的函数调用或成员访问,不信你可以试一试。
比如 A 和 B都有函数 fun,那么在类C定义里调用的时候得这么写
A::fun();
或 B::fun();
直接写fun() 将引发编译错误