When I try to run this code:
Instructor.cpp:
#include "Instructor.h"
#include "Person.h"
using std::string;
Instructor::Instructor() {
    Person();
    salary = 0;
}
Instructor::Instructor(string n, string d, string g, int s) {
    Person(n, d, g);
    salary = s;
}
void Instructor::print() {
    if (gender == "M")
        std::cout << "Mr. ";
    else
        std::cout << "Ms. ";
    Person::print();
    std::cout << "    Instructor, Salary: " << salary << std::endl;
}
Instructor.h:
#include <iostream>
#include <string>
class Instructor: public Person 
{
public:
    Instructor();
    Instructor(std::string n, std::string d, std::string g, int s);
    virtual void print();
protected:
    int salary;
};
Person.h:
#include <iostream>
#include <string>
class Person
{
public:
    Person();
    Person(std::string n, std::string d, std::string g);
    virtual void print();
protected:
    std::string name;
    std::string dob;
    std::string gender;
};
I receive these errors:
In file included from Instructor.cpp:1:0:
Instructor.h:5:1: error: expected class-name before ‘{’ token
 {
 ^
Instructor.cpp: In member function ‘virtual void Instructor::print()’:
Instructor.cpp:16:6: error: ‘gender’ was not declared in this scope
  if (gender == "M")
      ^
Instructor.cpp:20:16: error: cannot call member function ‘virtual void Person::print()’ without object
  Person::print();
All three of these errors are confusing me.  If the Instructor class was derived from Person, and within Person the gender field is protected, then why am I receiving error: ‘gender’ was not declared in this scope, as well as error: cannot call member function ‘virtual void Person::print()’ without object?
I feel like I'm doing something obviously wrong here, such as including the files incorrectly or something like that. Any help is appreciated.
You have to include person.h in instructor.h, otherwise the token Person is unknown to compiler. And when you do this, make sure you remove person.h from instructor.cpp. Otherwise you will get re-declaration error. But common practice is to use #ifdef directives in header files to prevent multiple inclusion. like in person.h
#ifndef PERSON_H
#define PERSON_H
/// class definition and other code
#endif //PERSON_H
or you can use  #pragma once in VC++.
Another error is you are not initializing Person portion of Instructor correctly. In the constructor :
Instructor::Instructor(string n, string d, string g, int s) {
  Person(n, d, g); // this will create a temporary `Person` object instead of initializing base part and 
                   // default constructor of `Person` will be used for this `Instructor` object
  salary = s;
}
do it like this
Instructor::Instructor(string n, string d, string g, int s): Person(n,d,g), salary(s) 
{   }
                        Several issues:
Instructor class, your Person class isn't defined yet. You should #include "Person.h" at the start of Instructor.h, which leads to the second issue...Your headers are not protected against double includes (which is the error you see in your comment above). To fix this, you need an include guard:
#ifndef PERSON_H
#define PERSON_H
class Person {
     // ...
};
#endif
The second time this file is included, PERSON_H is already defined, so what's between the #ifndef and the #endif will be ignored.
You are calling the base class constructor incorrectly. The correct syntax is:
Instructor::Instructor(string n, string d, string g, int s) : Person(n, d, g){
    salary = s;
}
What you are doing (writing Person(n, d, g); in the constructor body) will compile, because if you do not explicitly call the base class constructor, the compiler will try to call the parameterless default constructor for you, and in your case, Person happens to have a default constructor that can be called (if Person does not have a constructor that takes no parameters, you'll get a compile error). However, the effect of that statement is simply to create a temporary Person object that gets destructed at the end of the statement, not call the base class constructor.
This syntax (called a member initialization list) can also be used to initialize other class members, and in fact is the preferred way of doing so:
Instructor::Instructor(string n, string d, string g, int s) : Person(n, d, g), salary(s) { }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With