Niedziedziczenie operatora przypisania

0

#include <iostream>

class MyClass
{
public:
	MyClass(int a = 0) : skladnik(a) { std::cout << "Konstruktor\n"; }
	MyClass(MyClass& wz) { skladnik = wz.skladnik; std::cout << "Konstruktor kopiujacy\n"; }
	MyClass& operator=(const MyClass& wz) {
		if (this != &wz) this->skladnik = wz.skladnik;
		std::cout << "Operator przypisania\n";
		return *this;
	};
	~MyClass() { std::cout << "Destruktor\n"; }
	void wypisz() { std::cout << skladnik << "\n"; }
private:
	int skladnik;
};

class MyClass2 : public MyClass
{
public:
	MyClass2 (int a) : MyClass(a) {};
	~MyClass2() {};
private:
};



int main()
{
	MyClass2 obiekt1(10);
	obiekt1.wypisz();
	MyClass2 obiekt2 = obiekt1;
	obiekt2.wypisz();
	MyClass2 obiekt3(20);
	obiekt1 = obiekt3;
	obiekt1.wypisz();
}

Operator przypisania z klasy bazowej jest uruchamiany. Dlaczego?

2

A dlaczego miałby nie być uruchamiany? MyClass2 ma domyślny operator, a ten korzysta z tego zdefiniowanego w klasie bazowej.

1

W klasie MyClass2 kompilator utworzył domyślny operator przypisania, który wywołał operator przypisania z klasy bazowej. Tylko w przypadku kiedy utworzysz swój własny operator przypisania w klasie MyClass2, operator z klasy bazowej nie będzie wywoływany.

0

Ma marginesie tematu: masz okazję zobaczyć, że destruktor klasy bazowej nie jest wywoływany. Brak słowa virtual.

0

Przecież destruktor jest wywoływany. Virtual jest potrzebne tylko gdy planujemy polimorficzne użycie klasy (dynamiczne).

0

Jest wywoływany. Ja robię obiekty statyczne.
https://ideone.com/5iCQae

0

Może spróbuj czegoś w rodzaju MyClass& operator=(const MyClass& wz) = delete;

btw. byłby to pierwszy przypadek, że = delete się na coś przydało :)

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