#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
virtual int area()
{ return (0); }
};
class CRectangle: public CPolygon {
public:
int area() { return (width * height); }
};
Has ostrzeżenie kompilacjiCo oznacza komunikat "ma metodę wirtualną ... ale nie jest wirtualizatorem" podczas kompilacji C++?
Class '[[email protected]' has virtual method 'area' but non-virtual destructor
Jak rozumieć to ostrzeżenie i jak poprawić kod?
[EDIT] czy ta wersja jest teraz poprawna? (Próbując odpowiedzieć, aby wyjaśnić sobie koncepcję)
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
virtual ~CPolygon(){};
virtual int area()
{ return (0); }
};
class CRectangle: public CPolygon {
public:
int area() { return (width * height); }
~CRectangle(){}
};
Tak, nowa wersja jest poprawna. Chociaż uważane jest za dobrą formę do ponownego deklarowania funkcji w klasach pochodnych jako wirtualnych, nawet jeśli nie jest to konieczne. Jest tak, że ludzie, którzy chcą tylko przyjrzeć się klasie pochodnej, nadal wiedzą, że funkcje są wirtualne. – Omnifarious
Masz na myśli 'class CRectangle: public CPolygon { public: virtual int area() {return (szerokość * wysokość); } }; '? – qazwsx
Tak. Oraz 'virtual ~ CRectangle() {}'. Jak już wspomniałem, przekonanie, że te funkcje są wirtualne, jest po prostu dobrą formą, w żaden sposób nie jest wymagane przez język. – Omnifarious