C++ 基类指针只获取派生类变量值而不获取基类变量值为什么?
这是我的密码:C++ 基类指针只获取派生类变量值而不获取基类变量值为什么?,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,这是我的密码: #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(
#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;
}
#包括
使用名称空间std;
阶级形态
{
charobj;
公众:
int j;
形状();
void displayModel();
};
班级路线:公共形态
{
charobj;
公众:
第()行;
void displayModel();
};
Shape::Shape()
{
obj='S';
j=1;
}
void::Shape::displayModel()
{
难道为什么j
应该不同吗?只有一个j
,它在Shape
中声明。当你从Shape
派生时,你没有添加更多的j
,也需要在行中声明一些j
。另一方面,你有单独的obj
e> 形状
和线条
,这就是程序打印的原因
S Shape j:1
L Line j:5
S Shape j:5
注意:如果将void-Shape::displayModel()
virtual
,调用objPtr->displayModel();
将传播到void-Line::displayModel()
,您将得到两个L
s:
S Shape j:1
L Line j:5
L Line j:5
LogicStuff
是正确的
添加标记,如
cout我还没有尝试过该代码,但乍一看,我可以告诉你两件事:
第一个是使用C++中的多态性,需要使用“虚”关键字,具有虚拟函数或虚拟方法的类称为多态性。
class Shape{
private:
char obj;
public:
int j;
Shape();
virtual void displayModel();
};
其次,您应该使用基本静态类型声明对象,然后使用派生的动态类型实例化它
Shape *objPtr = new Line();
通过使用虚拟函数,程序“记住”动态类型,因此即使对象被升级为更通用的类型,也可以调用特定的方法
请记住,编译器执行此操作的方式是为具有虚拟函数的类提供一个虚拟表,从而消耗更多内存
希望这有帮助您的基类不是虚拟的。objPtr->displayModel()
调用Shape::displayModel()
哪个打印了Shape::j
@Jonathan Potter,但是Shape::j值没有初始化为1。那么为什么j=5?这是否意味着objPtr->j取了对象l的l.j的值?那么,基本上,objPtr指向的任何对象都会得到正确的对象j值?是的,但请记住,它实际上是j
的Shape
关于l
。是的,我知道。我之前只是怀疑objPtr->j会得到什么值,Shape对象的s.j值还是Line对象的l.j值。现在很清楚了。非常感谢。