Dziedziczenie - operator przypisania

0

Załóżmy, że klasa M ma operator przypisania w części private, a klasa K, która dziedziczy po klasie M nie ma operatora przypisania wcale. Pod jakim warunkiem mogą odbywać się przypisania obiektów klasy K ? Kompilator w tej sytuacji nie wygeneruje operator przypisania dla klasy pochodnej ?

0

Operator przypisania, jak i konstruktor kopiujący się nie dziedziczy. Jeżeli nie zdefiniujesz operatora przypisania kompilator będzie kopiował jedną klasę do drugiej kopiując zmienne składowe z jednej klasy do drugiej klasy. Jak masz w klasie wskaźniki to się źle skończy ;)

0

Z jednej strony dokladnie tak, z drugiej -- niekoniecznie.
Fakt, operatory przypisania tak jak i cctor'y nie sa "dziedziczone", jednak jesli napisze sie je "szczególnie właściwy sposób", to okaże się, że kompilator generując automatyczny domyślny kod cctor'a oraz operator='a dla klasy K .... będzie zobowiązany skorzystać z cctor'a/operator='a klasy bazowej. I to daje pole do popisu takim złotym przykładom, jak np. dziedziczona-blokada-kopiowalności, czyli np.:

http://www.boost.org/doc/libs/1_43_0/boost/noncopyable.hpp

//  Boost noncopyable.hpp header file  --------------------------------------//

//  (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost
//  Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

//  See http://www.boost.org/libs/utility for documentation.

// ....

namespace boost {

//  Private copy constructor and copy assignment ensure classes derived from
//  class noncopyable cannot be copied.

//  Contributed by Dave Abrahams

// .... 

  class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );                          // quetz: arg=const-ref
      const noncopyable& operator=( const noncopyable& );       // quetz: metoda=nieconst / ret=const-ref / arg=const-ref
  };

// .... 

} // namespace boost

// ... 
class K : boost::noncopyable { };

int main()
{
    K bum, ble, bee;  // ok

    // bum = ble;   // FAIL: cannot generate operator= for class K
}

oczywiscie blokada obowiazuje tak dlugo, jak owa klasa K nie zdefiniuje sobie cctora i/lub operator='a. Jesli w takiej K dopisac publiczny operator=, nieprobujacy uzywac {base}::operator=, to linia bum=ble będzie 100% ok

1 użytkowników online, w tym zalogowanych: 0, gości: 1