MST

星途 面试题库

面试题:C++ 运算符重载中的类型转换与多态性

假设你有一个自定义类 `MyClass`,在重载运算符时,如何结合类型转换函数,实现多态的运算符行为?例如,`MyClass` 与 `int` 类型之间的运算符重载,既要能处理 `MyClass + int`,也要能处理 `int + MyClass` 的情况,且在不同派生类中该运算符行为具有多态性。请详细说明思路并给出代码实现。
44.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 思路

    • 对于 MyClass + int 的情况,在 MyClass 类中重载 operator+ 运算符,参数为 int 类型。
    • 对于 int + MyClass 的情况,由于 int 是内置类型,无法在 int 类中重载运算符,所以需要在全局作用域中重载 operator+,参数顺序为 intMyClass。此时,为了使全局重载的 operator+ 能正确处理 MyClass 及其派生类对象,MyClass 类需要提供一个类型转换函数(如转换为 int 类型),以便在全局 operator+ 中使用。
    • 为了实现多态,MyClass 类中的 operator+ 应该声明为虚函数,派生类可以重写该虚函数来实现不同的行为。
  2. 代码实现

#include <iostream>

class MyClass {
public:
    // 虚函数,用于处理 MyClass + int 的情况
    virtual MyClass operator+(int num) const {
        // 这里简单返回一个新的 MyClass 对象,实际应用中可以有更复杂的逻辑
        return MyClass();
    }

    // 类型转换函数,用于处理 int + MyClass 的情况
    operator int() const {
        return 0;
    }
};

// 全局作用域中重载 operator+,用于处理 int + MyClass 的情况
MyClass operator+(int num, const MyClass& obj) {
    // 这里可以利用 MyClass 的类型转换函数进行计算
    int value = static_cast<int>(obj);
    return MyClass();
}

class DerivedClass : public MyClass {
public:
    // 重写虚函数,实现不同的行为
    DerivedClass operator+(int num) const override {
        // 这里简单返回一个新的 DerivedClass 对象,实际应用中可以有更复杂的逻辑
        return DerivedClass();
    }
};

可以通过以下方式测试代码:

int main() {
    MyClass myObj;
    DerivedClass derivedObj;
    int num = 5;

    MyClass result1 = myObj + num;
    MyClass result2 = num + myObj;

    DerivedClass derivedResult1 = derivedObj + num;
    MyClass derivedResult2 = num + derivedObj;

    return 0;
}

上述代码中,MyClass 类定义了虚的 operator+ 用于 MyClass + int 的情况,定义了类型转换函数用于 int + MyClass 的情况。DerivedClass 继承自 MyClass 并重写了 operator+ 以实现多态行为。在 main 函数中对不同情况进行了测试。