将一个 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
对象。但是我很难弄清楚顺序到底是什么。
下面的时间线是否正确?
- 语句
Test t(d);
暗示我们有 Bridge& b_(d)
(根据 Test
的构造函数)
Test
的构造函数创建了一个新对象,该对象是 Test
中的 b
最终设置为? 的对象
差不多。
测试需要 Bridge 并且有一个 Bridge 构造函数接受 Base 和 Derived 公开继承自 Base。因此,临时 类型的对象是使用 d
创建的,这用于构造 t
.
但这发生在 main
而不是在测试构造函数中。此外,这个临时对象在 Test t(d);
语句结束时被销毁。然而,此时您已经 复制了 测试构造函数中的临时对象,因此一切似乎都正常(除了内存泄漏)。
我有以下工作示例,其中我将 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
对象。但是我很难弄清楚顺序到底是什么。
下面的时间线是否正确?
- 语句
Test t(d);
暗示我们有Bridge& b_(d)
(根据Test
的构造函数) Test
的构造函数创建了一个新对象,该对象是Test
中的b
最终设置为? 的对象
差不多。
测试需要 Bridge 并且有一个 Bridge 构造函数接受 Base 和 Derived 公开继承自 Base。因此,临时 类型的对象是使用 d
创建的,这用于构造 t
.
但这发生在 main
而不是在测试构造函数中。此外,这个临时对象在 Test t(d);
语句结束时被销毁。然而,此时您已经 复制了 测试构造函数中的临时对象,因此一切似乎都正常(除了内存泄漏)。