代码之家  ›  专栏  ›  技术社区  ›  user2561762

通过移动派生类构造基类

  •  3
  • user2561762  · 技术社区  · 8 年前

    我有一个简化的代码示例:

    class Base {
        Base() = default;
        Base(const Base& src) {
            // construct by copying src etc. - ok, legal even if src points to Derived object
        }
    
        Base(Base&& src) {
            // construct by moving src - stealing its resources, ok, it was invented for this, 
            // but.. what if src points to Derived object?
        }
    };
    
    class Derived : public Base {
    
    };
    
    void foo() {
        Derived derived;
        Base base_by_copy_constructor(derived); // legal, derived cannot be touched so nothing will be wrong
        Base base_by_move(std::move(derived)); // uu? what's gonna happen, part of derived object (Base class) was moved..
    }
    

    这种行为恰当吗?这可能会导致奇怪的问题,因为基本部分od派生对象实际上是“去初始化的”。 所以我们应该避免从具有move操作符的类派生,还是让我们的派生类抵制“移动”它的基部分?

    (当然,这只是一个例子,类没有数据,move操作符什么都不做,所以这里不会出错。我问的是一个真实世界的例子,这种情况:))

    1 回复  |  直到 8 年前
        1
  •  1
  •   Oliv    8 年前

    他们的切片没有问题,这可以明确而深入地完成。

    然而,在进行OO编程时,通常只有一条规则: 不要让对象(或组件)外部的任何实体有机会打破不变量。

    因此,如果调用基类的成员或构造函数可能会破坏派生类在其与基类之间建立的不变量,那么基类必须是私有的。(您仍然可以公开不使用 using base::member )