C ++ Чистая виртуальная производная функция - PullRequest
0 голосов
/ 27 ноября 2018

Я изучаю объектно-ориентированный 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, мы получим поведениеЯ только что описал.Делает ли наличие чисто виртуальной функции в базовом классе автоматически все виртуальные определения этой функции?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вам не нужно иметь чисто виртуальную функцию, чтобы получить полиморфное поведение.Обычная виртуальная функция также может выполнить это.

Да, указание функции как virtual в классе означает, что она остается virtual во всех классах, производных от нее.

Из C +Начиная с +11, есть также спецификатор override:
В объявлении или определении функции-члена override гарантирует, что функция virtual и переопределяет виртуальную функцию из базыкласс.

0 голосов
/ 27 ноября 2018

virtual наследуется.Если вы сделаете родительскую функцию virtual, тогда она будет оставаться virtual во всех дочерних классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...