将一个 class 的对象隐式转换为另一个

Implicitly converting an object of one class to another

我有以下工作示例,其中我将 Derived 类型的对象传递给需要 Bridge 类型对象的构造函数:

#include <iostream>

class Base {
public:
    Base() {};
    virtual Base* clone() const = 0;
    virtual ~Base() {};
};

class Derived : public Base {
public:
    Derived() {};
    virtual Base* clone() const {
        std::cout << "Cloned derived\n";
        return new Derived(*this);
    }
    virtual ~Derived() {}
};

class Bridge {
public:
    Bridge(const Base& b_) {
        b = b_.clone();
        std::cout << "Cloned b\n";
    };
    ~Bridge() {}
private:
    Base *b;
};

class Test {
public:
    Test(const Bridge& b_) : b(b_) {};
    
private:
    Bridge b;
};

int main()
{
    Derived d;
    Test t(d);
}

为什么允许这样做?据我所知,它的工作原理是因为 Bridge 的构造函数引用了 Base 对象。但是我很难弄清楚顺序到底是什么。

下面的时间线是否正确?

  1. 语句 Test t(d); 暗示我们有 Bridge& b_(d)(根据 Test 的构造函数)
  2. Test 的构造函数创建了一个新对象,该对象是 Test 中的 b 最终设置为?
  3. 的对象

差不多。

测试需要 Bridge 并且有一个 Bridge 构造函数接受 Base 和 Derived 公开继承自 Base。因此,临时 类型的对象是使用 d 创建的,这用于构造 t.

但这发生在 main 而不是在测试构造函数中。此外,这个临时对象在 Test t(d); 语句结束时被销毁。然而,此时您已经 复制了 测试构造函数中的临时对象,因此一切似乎都正常(除了内存泄漏)。