这是我的代码:
#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
。另一方面,您为obj
和Shape
分别设置了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