Частичное переопределение перегруженных виртуальных функций

Класс заменяет часть наследованных виртуальных функций с именем

Описание

Частичное переопределение перегруженных виртуальных функций происходит когда:

  • Базовый класс имеет несколько методов virtual с тем же именем, но различными подписями (перегрузка).

  • Класс, выведенный от базового класса, заменяет по крайней мере один из тех методов virtual, но не всех их.

Риск

Методы virtual, которые не заменяет производный класс, скрыты. Вы не можете вызвать те методы с помощью объекта производного класса.

Фиксация

Смотрите, требуются ли перегрузки в базовом классе. Если они необходимы, возможные решения включают:

  • В вашем производном классе, если вы заменяете один метод virtual, заменяют все методы virtual от базового класса с тем же именем как тот метод.

  • В противном случае добавьте строку using Base_class_name::method_name в объявление производного класса. Таким образом можно вызвать методы базового класса с помощью объекта производного класса.

Примеры

развернуть все

class Base {
public:
    explicit Base(int b);
    virtual ~Base() {};
    virtual void set()           {
        _b = (int)0;
    };
    virtual void set(short i)    {
        _b = (int)i;
    };
    virtual void set(int i)      {
        _b = (int)i;
    };
    virtual void set(long i)     {
        _b = (int)i;
    };
    virtual void set(float i)    {
        _b = (int)i;
    };
    virtual void set(double i)   {
        _b = (int)i;
    };
private:
    int _b;
};

class Derived: public Base {             
        public:
                Derived(int b, int d): Base(b), _d(d) {};
                void set(int i)    { Base::set(i); _d = (int)i; };
        private:
                int _d;
};

В этом примере класс Derived заменяет функциональный set, который берет аргумент int. Это не заменяет другие функции, которые имеют то же имя set, но берут аргументы других типов.

Дефект появляется на имени производного класса в определении производного класса. Чтобы найти, какой метод базового класса заменен:

  1. Перейдите к определению базового класса. На панели Source щелкните правой кнопкой по имени базового класса и выберите Go To Definition.

  2. В определении базового класса идентифицируйте метод, который имеет то же имя и подпись как имя метода производного класса.

Исправление — выводит на экран метод базового класса

Одно возможное исправление, добавляет строка using Base::set в объявление класса Derived.

class Base {
public:
    explicit Base(int b);
    virtual ~Base() {};
    virtual void set()           {
        _b = (int)0;
    };
    virtual void set(short i)    {
        _b = (int)i;
    };
    virtual void set(int i)      {
        _b = (int)i;
    };
    virtual void set(long i)     {
        _b = (int)i;
    };
    virtual void set(float i)    {
        _b = (int)i;
    };
    virtual void set(double i)   {
        _b = (int)i;
    };
private:
    int _b;
};

class Derived: public Base {             
        public:
                Derived(int b, int d): Base(b), _d(d) {};
                using Base::set;
                void set(int i)    { Base::set(i); _d = (int)i; };
        private:
                int _d;
};

Информация о результате

Группа: Объектно-ориентированный
Язык: C++
Значение по умолчанию: на
Синтаксис командной строки: PARTIAL_OVERRIDE
Влияние: носитель

Введенный в R2015b