这是我的代码:
#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
?
答案 0 :(得分:2)
为什么j
会有所不同?只有一个j
,在Shape
中声明。当您从Shape
派生时,您不会添加更多j
s,那么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
:< / p>
S Shape j:1
L Line j:5
L Line j:5
答案 1 :(得分:0)
LogicStuff
是对的。
添加标记,例如cout << 'In Shape::displayModel() function'
和cout << 'In Line::displayModel() function'
它应该可以帮助您了解追加的内容。
答案 2 :(得分:0)
我还没有尝试过代码,但乍一看我可以告诉你两件事:
首先,要在c ++中使用多态,你需要使用&#34; virtual&#34;关键词。具有虚函数或虚方法的类称为多态。
class Shape{
private:
char obj;
public:
int j;
Shape();
virtual void displayModel();
};
其次,您应该使用基本静态类型声明您的对象,然后使用派生的动态类型来实例化它。
Shape *objPtr = new Line();
通过使用虚拟功能,程序&#34;记住&#34;即使在将对象升级为更一般的类型之后,动态类型也可以调用特定方法。
请记住,编译器执行此操作的方式是为具有虚函数的类提供虚拟表,从而消耗更多内存。
希望这有帮助