MST

星途 面试题库

面试题:C++多重继承中二义性消除方法之基础应用

假设有类A、类B和类C,类C多重继承自类A和类B,类A和类B都有一个名为print的成员函数。请写出代码实现消除在类C对象调用print函数时的二义性,并解释你所使用的方法。
48.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class A {
public:
    void print() {
        std::cout << "A's print function" << std::endl;
    }
};

class B {
public:
    void print() {
        std::cout << "B's print function" << std::endl;
    }
};

class C : public A, public B {
public:
    // 使用using声明来消除二义性
    using A::print; 
    // 如果想默认调用A的print函数,也可以在这里重新定义print函数
    // void print() {
    //     A::print();
    // }
};

int main() {
    C c;
    c.print(); 
    return 0;
}

解释

  1. using声明:在类C中使用using A::print;,这样在C的作用域内,print函数优先解析为A类中的print函数,从而消除了调用print函数时的二义性。如果同时使用using A::print;using B::print;,在调用c.print()时仍会有二义性,除非使用c.A::print();c.B::print();这样明确指定作用域的方式调用。
  2. 重新定义:也可以在类C中重新定义print函数,如上述注释部分代码,这样可以选择默认调用Aprint函数或者按照需求自定义实现。