仅对两个父级中的一个进行赋值操作符

Assignment operator on only one of two parents

本文关键字:一个 赋值操作符 两个      更新时间:2023-10-16

子节点有两个父节点:Foo和Bar。Foo不允许复制。酒吧。孩子如何使用Bar的赋值运算符复制到Bar的子子集(同时留下Foo的子集完好无损)?

更具体地说:在下面的代码中,Child如何在replace_bar()中引用Bar ?(如何修改(X)行使代码编译?)

class Foo
{
public:
    Foo () {}
private:
    Foo (const Foo & f) {} // forbid copy construction
    Foo & operator= (const Foo & foo) {} // forbid assignment
};
class Bar
{
public:
    Bar () {}
    Bar & operator= (const Bar & bar) {}
};
class Child : public Foo, public Bar
{
public:
    Child () {}
    void replace_bar (const Bar & bar2)
    {
        *this = bar2;           // line (X)
    }
};
int main ()
{
    Child child;
    Bar newbar;
    child.replace_bar (newbar);
}
void replace_bar(const Bar& bar2) {
     Bar::operator=(bar2);
}

在其他新闻中,你在Bar::operator=中缺少了一个return *this;,如果你想做的只是防止复制Foo,你不应该定义复制构造函数和赋值操作符,只声明它们。这样,即使你试图在类中使用它们,你也会得到一个错误(尽管是链接错误而不是编译错误)。

class Foo {
    Foo(const Foo&); // no body
    Foo& operator=(const Foo&); // ditto
public: 
    Foo() { }
};