MST

星途 面试题库

面试题:C++ 多重继承下复杂二义性场景及解决

在C++中,有类X,类Y继承自类X,类Z也继承自类X,类W多重继承自类Y和类Z。若类X有成员变量data,在类W中访问data时可能会出现二义性。请编写完整代码展示这种二义性,并阐述至少两种不同的消除二义性的方法及其原理。
35.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

展示二义性的代码

#include <iostream>

class X {
public:
    int data;
};

class Y : public X {};

class Z : public X {};

class W : public Y, public Z {};

int main() {
    W w;
    // 以下代码会产生二义性错误
    // w.data = 10; 
    return 0;
}

消除二义性的方法及原理

1. 使用作用域运算符指定路径

原理:明确告诉编译器从哪个父类路径去访问成员变量,从而消除歧义。

#include <iostream>

class X {
public:
    int data;
};

class Y : public X {};

class Z : public X {};

class W : public Y, public Z {};

int main() {
    W w;
    w.Y::data = 10;
    std::cout << "通过Y路径访问data: " << w.Y::data << std::endl;
    w.Z::data = 20;
    std::cout << "通过Z路径访问data: " << w.Z::data << std::endl;
    return 0;
}

2. 使用虚继承

原理:虚继承使得从不同路径继承过来的同名成员变量在派生类中只有一份拷贝,避免了因多份拷贝导致的访问歧义。

#include <iostream>

class X {
public:
    int data;
};

class Y : virtual public X {};

class Z : virtual public X {};

class W : public Y, public Z {};

int main() {
    W w;
    w.data = 10;
    std::cout << "虚继承后访问data: " << w.data << std::endl;
    return 0;
}