MST

星途 面试题库

面试题:C++中多重继承二义性的常见消除方法及示例

请简述C++多重继承产生二义性的原因,并列举至少两种消除二义性的方法,同时各给出一个简单的代码示例。
16.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

二义性产生原因

在C++多重继承中,当一个派生类从多个基类继承,且这些基类中有同名成员(函数或变量)时,就会产生二义性。因为编译器无法确定派生类对象访问该同名成员时,应该使用哪个基类的成员。

消除二义性的方法及示例

  1. 使用作用域运算符明确指定
#include <iostream>

class Base1 {
public:
    void display() {
        std::cout << "Base1 display" << std::endl;
    }
};

class Base2 {
public:
    void display() {
        std::cout << "Base2 display" << std::endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    void callDisplay() {
        // 明确指定使用Base1的display函数
        Base1::display(); 
        // 明确指定使用Base2的display函数
        Base2::display(); 
    }
};

int main() {
    Derived d;
    d.callDisplay();
    return 0;
}
  1. 在派生类中重写同名成员
#include <iostream>

class Base1 {
public:
    void display() {
        std::cout << "Base1 display" << std::endl;
    }
};

class Base2 {
public:
    void display() {
        std::cout << "Base2 display" << std::endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    void display() {
        // 这里可以选择调用某个基类的display,或者执行新的逻辑
        Base1::display(); 
        std::cout << "Derived display" << std::endl;
    }
};

int main() {
    Derived d;
    d.display();
    return 0;
}