gpt4 book ai didi

C++ 继承相同类型签名的成员函数(阴影)

转载 作者:行者123 更新时间:2023-11-30 04:19:38 25 4
gpt4 key购买 nike

 // 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
}

The first call to display() (on student) calls the Student version of display(). The second call to display() (on person) calls the Person version of display(). The derived version of display() shadows the base version on the student object. The base version executes on the person object.

那时我不明白什么是阴影。我意识到这两个类都定义了相同的显示功能,很明显,如果您调用 student.display 和 person.display,它会相应地调用它们。那么这是什么意思:

The derived version of display() shadows the base version on the student object. The base version executes on the person object.

我不懂阴影。

来源:https://scs.senecac.on.ca/~btp200/pages/content/dfunc.html继承 - 派生类的功能

最佳答案

您的Student 类继承自Person。这意味着,除其他外,Student 对象由 Student 中定义的所有内部结构和 Person 中定义的所有内部结构组成 - 为此matter Student 可以被视为包含 Person。这意味着 Student 对象包含两个版本的 display 方法 - 一个来自基类,一个来自派生类。 Shadowing是指派生对象调用display时,会调用派生类版本,而基类版本被其“隐藏”,不被调用。您可以从 Student 中调用阴影版本,方法是使用基类前缀显式指定它:Person::display。通常,将被调用的函数是范围最接近的函数 - 对于 Derived 对象,它是 Derived 的范围,而驻留在外部范围(例如 base)中的函数是阴影消失了。

关于C++ 继承相同类型签名的成员函数(阴影),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com