与此相同:从父类的实例创建派生类的实例
除了:
如果这是一个 XY 问题:我想从我计划创建的
std::cout
的派生类创建我自己的 ostream
实例,它将有一些额外的方法和重写的运算符,这将允许我执行以下操作更多的事情,其中包括在其他地方静音输出的能力,所有将数据传递到 cout
的代码保持不变。
例如
mutableCout << someData << "," << someData;
保持不变,但在其他地方我可以写mutableCout.mute()
但就 C++ 而言,我总体上对这个问题感兴趣。
在C++中可行吗?
我希望它看起来像这样:
class A
{
A(<...>);
SomeTypeA m_a;
SomeTypeB m_b;
.
.
.
SomeTypeZ m_z;
}
class B : public A
{
public:
B(A instanceOfA, someValueB)
{
<...copy everything from instanceOfA...>;
valueB = someValueB;
}
void set() {valueB = true};
void unset() {valueB = false};
private:
bool valueB;
}
extern A instanceOfA;
B instanceOfB = B(instanceOfA, false);
...
instanceOfB.set();
说
<...copy everything from instanceOfA...>
的部分是我想讨论的部分(如果可行的话)。我不想写:
m_a = instanceOfA.m_a
m_b = instanceOfA.m_b
....
m_z = instanceOfA.m_z
问题:在C++中可行吗?
如果我们忽略您计划这样做的事实
std::cout
,在您的具体示例中您可以这样做:
B(A a) : A(std::move(a)) // `move` is optional
{
// ...
}
或者这个:(稍微不太理想,但可以在
B
的构造函数之外使用)
B(A a)
{
A::operator=(std::move(a)); // `move` is optional
// ...
}
但是如果您的目标是自定义
std::cout
的行为,这不是最好的选择。 std::cout
的状态是不可复制的,更好的选择是创建自己独立的std::ostream
。
或者,更好的选择是忘记输出流。 C++20
std::format
很可能是文本输出的未来。考虑创建您自己的函数包装 std::format
并打印结果。