Я изучаю объектно-ориентированный C ++ и у меня возник вопрос о виртуальном / чисто виртуальном и многоуровневом наследовании.
Допустим, у меня есть простой код, подобный этому:
class Shape
{
virtual int getWidth() = 0;
};
class Rectangle: public Shape
{
private:
int length, width;
public:
Rectangle(_length, _width) { length = _length; width = _width }
int getWidth() { return width }
};
class Square: public Rectangle
{
private:
int length;
public:
Square(int _length):Rectangle(_length, _length) { length = _length };
int getWidth() { return length+1 }; //arbitarily add 1 to distinguish
};
int main()
{
Rectangle* r = new Square(5);
std::cout << r->getWidth << std::endl; //prints 6 instead of 5? It's as if rectangles getWidth is virtual
}
Насколько я понимаю, полиморфизм будет использовать функцию класса "Base", если getWidth не указан как виртуальный.Под этим я подразумеваю, что последний вызов r-> getArea должен использовать getArea Rectangle вместо getArea Square.
В этом случае я замечаю, что если я удалю чисто виртуальное объявление в Shape, мы получим поведениеЯ только что описал.Делает ли наличие чисто виртуальной функции в базовом классе автоматически все виртуальные определения этой функции?