C++:从父类的实例创建派生类的实例,无需构造函数/进一步知识

问题描述 投票:0回答:1

与此相同:从父类的实例创建派生类的实例

除了:

  1. C++(我不懂 C#,这正是 SO 研究成果)
  2. 我不想编写现有实例具有的所有参数的列表并将它们复制过来。我想一下子做到这一点,当父类更改时,此代码不需要更新。

如果这是一个 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++中可行吗?

c++ derived-class
1个回答
0
投票

如果我们忽略您计划这样做的事实

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
并打印结果。

© www.soinside.com 2019 - 2024. All rights reserved.