作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于下面的代码,当基类指针赋值给派生类时,我对多态有疑问。
当派生类的对象直接使用打印函数时,输出是显而易见的。
当我使用基类指针指向派生类的对象时,会使用基类的打印函数,但输出的是派生对象的信息。任何人都可以详细解释为什么吗?谢谢!
class Person {
public:
Person() {};
Person(string nm):name(nm) {};
void print() const;
private:
string name;
};
class Student : public Person {
public:
Student(int num, string nm) : IDNumber(num), Person(nm) {};
void print() const;
private:
int IDNumber;
}
class Employee : public Person {
public:
Employee(int num, int sal, string nm) : IDNumber(num), salary(sal), Person(nm) {};
void print() const;
private:
int IDNumber, salary;
}
void Person::print() const {
cout << name << endl;
}
void Student::print() const {
cout << "GoGoGo! ";
Person::print();
}
void Employee::print() const {
cout << "I work: ";
Person::print();
}
int main() {
Person per("Peter");
Student stu(3141, "Sally");
Employee emp(2718, 40, "Edward");
Person* ptr = &per;
Person* ptr2 = &stu;
Person* ptr3 = &emp;
per.print(); //Peter
stu.print(); //GoGoGo! Sally
emp.print(); //I work: Edward
ptr->print(); //Peter
ptr2->print(); //Sally
ptr3->print(); //Edward
return 0;
}
最佳答案
print()
函数不是虚拟的
,因此不是多态的。基类上的功能隐藏了子类的功能。
要使代码按预期工作,您唯一需要做的就是在 Person
类中使 print()
成为虚拟:
class Person {
public:
Person() {};
virtual ~Person() {};
Person(string nm):name(nm) {};
virtual void print() const;
private:
string name;
};
请注意,我添加了一个虚拟析构函数,这是每个要继承的类所必需的。
输出显示派生对象的信息,因为子类继承了基类的成员(即 name
,设置为 Peter、Sally 和 Edward)。
关于c++ - 分配给派生类的基类指针和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025384/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!