基类指针只获取Derived类变量值而不是基类变量值为什么?

时间:2015-11-19 22:25:00

标签: 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()
{
    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

3 个答案:

答案 0 :(得分:2)

为什么j会有所不同?只有一个j,在Shape中声明。当您从Shape派生时,您不会添加更多j s,那么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:< / 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;即使在将对象升级为更一般的类型之后,动态类型也可以调用特定方法。

请记住,编译器执行此操作的方式是为具有虚函数的类提供虚拟表,从而消耗更多内存。

希望这有帮助