这是我的代码:

#include<iostream>
using namespace std;

class Shape
{
    char obj;

public:
    int j;
    Shape();
    void displayModel();
};

class Line : public Shape
{
    char obj;

public:
    Line();
    void displayModel();
};

Shape::Shape()
{
    obj = 'S';
    j = 1;
}

void ::Shape::displayModel()
{
    cout << obj;
    cout << " Shape j:" << j << endl;
}

Line::Line()
{
    obj = 'L';
    j = 5;
}

void Line::displayModel()
{
    cout << obj;
    cout << " Line j:" << j << endl;
}

int main()
{
    Shape *objPtr = NULL, s;
    Line l;
    objPtr = &l;

    s.displayModel();
    l.displayModel();
    objPtr->displayModel();

    return 0;
}

我的疑问是,当执行objPtr->displayModel()时,为什么会使用j=5而不是j=1吗?我知道objPtr被分配给对象l的地址。但是我没有在virtual中声明Shape::displayModel()关键字,这是否意味着编译器应该检查对象的type而不是它指向的对象?还是仅当声明了virtual关键字且不包含变量时才对函数调用发生这种情况?

所以基本上我的疑问是,为什么objPtr->displayModel()打印j=5而不是j=1

最佳答案

为什么j应该不同?只有一个j,它在Shape中声明。当您从Shape派生时,您没有添加更多j,那么在j中也需要声明一些Line。另一方面,您为objShape分别设置了Line,因此这就是程序打印的原因

S Shape j:1
L Line j:5
S Shape j:5

注意:如果您将void Shape::displayModel()设为virtual,则调用objPtr->displayModel();将改为传播到void Line::displayModel(),您将获得两个L:
S Shape j:1
L Line j:5
L Line j:5

10-07 12:58