Partial override of overloaded virtual functions

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

Описание

Этот дефект происходит когда:

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

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

Риск

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

Фиксация

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

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

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

Примеры

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

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