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 ?
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 ;)
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