C# cannot override inherited member

0xabc picture 0xabc · Dec 16, 2014 · Viewed 13.9k times · Source

I'm learning C# from a book named Chegwidden Gladdis. I'm making the same program and same code as written in the book. but there is a problem. i can't override a method from a parent class. I had fully readed the book from the start of chapter, 5 times, everyhing is the same but I can't figure out why I can't can't override a method from a parent class. Here's the code from the base class PassFailActivity.cs

using System;
namespace ProtectedMembers
{
    public class PassFailActivity : GradedActivity2
    {
        private double minPassingScore; // Minimum passing score

        /// <summary>
        /// The constructor sets the minimum passing score
        /// </summary>
        /// <param name="mps">The minimum passing score.</param>
        public PassFailActivity(double mps)
        {
            minPassingScore = mps;
        }

        /// <summary>
        /// The GetGrade method returns a letter grade determined
        /// from the score field. This methos overrides the base class method.
        /// </summary>
        /// <returns>The letter grade</returns>
        public override char GetGrade()
        {
            char letterGrade;

            if (base.GetScore() >= minPassingScore)
                letterGrade = 'P';
            else
                letterGrade = 'F';

            return letterGrade;
        }
    }
}

and GradedActivity2.cs

using System;

namespace ProtectedMembers
{
    public class GradedActivity2
    {
        protected double score; // Numberic score

        /// <summary>
        /// The SetScore method sets the score field.
        /// </summary>
        /// <param name="s">The value to store in score</param>
        public void SetScore(double s)
        {
            score = s;
        }

        /// <summary>
        /// The GetScore method returns the score.
        /// </summary>
        /// <returns>The value stored in the score field</returns>
        public double GetScore()
        {
            return score;
        }

        /// <summary>
        /// The GetGrade method returns a letter grade determined from the score field.
        /// </summary>
        /// <returns>Return the letter grade</returns>
        public char GetGrade()
        {
            char letterGrade;

            if (score >= 90)
                letterGrade = 'A';
            else if (score >= 80)
                letterGrade = 'B';
            else if (score >= 70)
                letterGrade = 'C';
            else if (score >= 60)
                letterGrade = 'D';
            else
                letterGrade = 'F';

            return letterGrade;
        }
    }
}

and PassFailExam

using System;

namespace ProtectedMembers
{
    public class PassFailExam : PassFailActivity
    {
        private int numQuestions; // Number of questions
        private double pointsEach; // Points for each question
        private int numMissed; // Number of questions missed

        /// <summary>
        /// The constructor sets the number of questions, the number
        /// of questions missed, and the minimum passing score.
        /// </summary>
        /// <param name="questions">The number of questions</param>
        /// <param name="missed">The number of questions missed</param>
        /// <param name="minPassing">The minimum passing score</param>
        public PassFailExam(int questions, int missed, double minPassing) : base(minPassing)
        {
            // Declare a local variable for the score.
            double numericScore;

            // Set the numQuestions and numMissed fields.
            numQuestions = questions;
            numMissed = missed;

            // Calculate the points for each questions and the numeric score for this exam.
            pointsEach = 100.0 / questions;
            numericScore = 100.0 - (missed * pointsEach);

            // Call the base class's SetScore method to set the mumeric score.
            SetScore(numericScore);
        }

        /// <summary>
        /// The GetpointsEach method returns the number of points each questions is worth
        /// </summary>
        /// <returns>The value in the pointsEach field</returns>
        public double GetPointsEach()
        {
            return pointsEach;
        }

        /// <summary>
        /// The GetNumMissed method returns the number of questions missed
        /// </summary>
        /// <returns>The value in the numMissed field</returns>
        public int GetNumMissed()
        {
            return numMissed;
        }
    }
}

and here is my Main

using System;

namespace ProtectedMembers
{
    public class PassFailExamDemo
    {
        public static void Main111()
        {
            int questions, // Number of questions
                missed; // Number of questions missed
            double minPassing; // Minmum passing score

            // Get the number of questions on the exam
            Console.Write("How many questions are " + "on the exam? ");
            questions = Convert.ToInt32(Console.ReadLine());

            // Get the number of questions missed.
            Console.Write("How many questions did " + "the student miss? ");
            missed = Convert.ToInt32(Console.ReadLine());

            // Get the minimum passing score
            Console.Write("What is the minimum " + "passing score? ");
            minPassing = Convert.ToInt32(Console.ReadLine());

            // Create a PassFailExam project
            PassFailExam exam = new PassFailExam(questions, missed, minPassing);

            // Display the teset results.
            Console.WriteLine("Each questions counts {0} points.",
                exam.GetPointsEach());
            Console.WriteLine("The exam score is {0} ",
                exam.GetScore());
            Console.WriteLine("The exam grade is {0} ",
                exam.GetGrade());
            Console.ReadLine();
        }
    }
}

the output should be

How many questions are on the exam? 100
How many questions did the student miss? 25
What is the minimum passing score? 60
Each question counts 1 points.
The exam score is 75
The exam grade is P

I have tried to make the base method virtual and calling override when trying to override it and that just gets me this error "'ProtectedMembers.PassFailActivity.GetGrade()': cannot override inherited member 'ProtectedMembers.GradedActivity2.GetGrade()' because it is not marked virtual, abstract, or override". i fully checked

Answer

Sadique picture Sadique · Dec 16, 2014

The error is self-explanatory, mark the function virtual in GradedActivity2:

public virtual char GetGrade()

From MSDN:

The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it: