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值。现在很清楚了。非常感谢。