Partial override of overloaded virtual functions

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

Описание

Этот дефект возникает, когда:

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

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

Риск

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

Зафиксировать

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

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

  • В противном случае добавьте линии с помощью 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. В определении базового класса идентифицируйте метод, который имеет то же имя и сигнатуру, что и имя метода производного класса.

Коррекция - метод Unhide Base Class

Одной из возможных коррекций является добавление линии 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: PARTIAL_OVERRIDE
Влияние: Средний
Введенный в R2015b