// Shadowing
#include <iostream>
using namespace std;
const int MNAME = 30;
const int M = 13;
class Person { // Base Class
char person[MNAME+1];
public:
void set(const char* n);
void display(ostream&) const;
protected:
const char* name() const;
};
void Person::set(const char* n) {
strncpy(person, n, MNAME);
person[MNAME] = '\0';
}
void Person::display(ostream& os) const {
os << person << ' ';
}
const char* Person::name() const { return person; }
class Student : public Person { // Derived
int no;
char grade[M+1];
public:
Student();
Student(int, const char*);
void display(ostream&) const;
};
Student::Student() {
no = 0;
grade[0] = '\0';
}
Student::Student(int n, const char* g) {
// see p.61 for validation logic
no = n;
strcpy(grade, g);
}
void Student::display(ostream& os) const {
os << name() << ' '
<< no << << ' ' << grade << endl;
}
int main() {
Person person;
Student student(975, "ABBAD");
student.set("Harry");
student.display(cout); // Harry 975 ABBAD
person.set("Jane Doe");
person.display(cout); // Jane Doe
}
对 display() 的第一次调用(在学生上)调用 display() 的学生版本。对 display() 的第二次调用(在 person 上)调用 display() 的 Person 版本。display() 的派生版本在学生对象上隐藏了基础版本。基本版本在 person 对象上执行。
我不明白什么是阴影。我意识到这两个类都定义了相同的显示函数,显然如果你调用 student.display 和 person.display 它会相应地调用它们。那么这是什么意思:
display() 的派生版本在学生对象上隐藏了基础版本。基本版本在 person 对象上执行。
我不明白阴影。
来源:https ://scs.senecac.on.ca/~btp200/pages/content/dfunc.html 继承 - 派生类的函数