c++ - 分配给派生类的基类指针和多态性

标签 c++ pointers polymorphism

对于下面的代码,当基类指针赋值给派生类时,我对多态有疑问。

当派生类的对象直接使用打印函数时,输出是显而易见的。

当我使用基类指针指向派生类的对象时,会使用基类的打印函数,但输出的是派生对象的信息。任何人都可以详细解释为什么吗?谢谢!

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/

相关文章:

c++ - 如何将返回的 ref 封装为指向 C_string 的指针?

c++ - 如何将类型删除技术应用于现有类型?

Spring Mongo Repository 多态性

c++ - 可以使用 <、>、= 比较双字段吗?

c++ - QT线程中的Lua脚本

c++ - 未格式化的输入到 std::string 而不是来自二进制文件的 c-string

c - 打印双指针字符数组时出现运行时错误

image - OpenCV图像指针无法按预期工作

java - super . super .func()? - Java多态性

关于复制构造函数的 C++ OOP 程序问题?遗产