2014-11-04 2 views
9

Я смущен различиями между переопределением и переопределением функций в производных классах.Переопределение по сравнению с переопределением в C++

Я знаю, что - в C++ переопределенные функции статически связаны, а переопределенные функции динамически связаны и что виртуальная функция переопределяется, а не виртуальная функция переопределяется.

Когда производный класс «переопределяет» метод в базовом классе, его рассмотренное переопределение. Но когда производный класс виртуальный, он больше не переопределяет, а скорее переопределяет. Поэтому я понимаю логистику правил, но я не понимаю сути.

В приведенном ниже примере функция SetScore переопределяется. Однако, если я сделаю функцию setScore в базовом классе виртуальной (добавив к ней слово virtual), setScore в производном классе будет переопределен. Я не понимаю итоговый результат - в чем разница. в setScore?

Базовый класс:

class GradedActivity 
{ 
protected: 
    char letter;   // To hold the letter grade 
    double score;   // To hold the numeric score 
    void determineGrade(); // Determines the letter grade 
public: 
    // Default constructor 
    GradedActivity() 
    { letter = ' '; score = 0.0; } 

// Mutator function 
    void setScore(double s) 
     { score = s; 
     determineGrade();} 

    // Accessor functions 
    double getScore() const 
     { return score; } 

     char getLetterGrade() const 
     { return letter; } 
}; 

Производный класс:

class CurvedActivity : public GradedActivity 
{ 
protected: 
    double rawScore;  // Unadjusted score 
    double percentage; // Curve percentage 
public: 
    // Default constructor 
    CurvedActivity() : GradedActivity() 
     { rawScore = 0.0; percentage = 0.0; } 

    // Mutator functions 
    void setScore(double s) 
     { rawScore = s; 
     GradedActivity::setScore(rawScore * percentage); } 

    void setPercentage(double c) 
     { percentage = c; } 

    // Accessor funtions 
    double getPercentage() const 
     { return percentage; } 

    double getRawScore() const 
     { return rawScore; } 
}; 

Это главное:

// Define a CurvedActivity object. 
    CurvedActivity exam; 

    ... 

    // Send the values to the exam object. 
    exam.setPercentage(percentage); 
    exam.setScore(numericScore); 
+0

Переопределение облегчает классовый полиморфизм. Перегрузка облегчает функциональный полиморфизм. Переопределение не делает и не является ошибкой. – orfdorf

ответ

14

Вот некоторые основные отличия:

overloaded Функция - это функция, которая делит свое имя с одной или несколькими другими функциями, но имеет другой список параметров. Компилятор выбирает, какая функция требуется на основе используемых аргументов.

overridden Функция - это метод в классе потомков, который имеет другое определение, чем виртуальная функция в классе предков. Компилятор выбирает, какая функция нужна, исходя из типа объекта, который используется для вызова функции.

A redefined Функция - это метод в классе потомков, который имеет другое определение, отличное от не виртуальной функции в классе предков. Не делай этого. Поскольку метод не является виртуальным, компилятор выбирает, какую функцию вызывать на основе статического типа ссылки на объект, а не на фактический тип объекта.

  • Статический тип проверки означает, что проверка типа происходит во время компиляции. В этом случае во время выполнения информация о типе не используется.

  • Проверка динамического типа возникает, когда информация о типе используется во время выполнения. C++ использует механизм RTTI (информация типа времени выполнения) для его реализации. Наиболее распространенным примером использования RTTI является оператор dynamic_cast, который допускает downcasting полиморфных типов:

+0

Спасибо, это может быть глупо, но что это значит: статический тип ссылки на объект. – YelizavetaYR

+0

Функция перегружает только в том же объеме. Можете добавить это. – Deduplicator

+3

* «Компилятор выбирает, какая функция требуется, исходя из типа объекта, который используется для вызова функции». * Это неверно, компилятор ничего не решает. Решение выполняется во время выполнения через vtable-поиск. – Manu343726