c++ - 基类指针只得到一个派生类变量值而不是基类变量值为什么?

标签 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 的地址。但是我没有在 Shape::displayModel() 中声明 virtual 关键字,所以这是否意味着编译器应该检查 type对象而不是它指向什么?还是仅当声明了 virtual 关键字且不包含变量时,函数调用才会发生这种情况?

所以基本上我的疑问是为什么 objPtr->displayModel() 打印 j=5 而不是 j=1

最佳答案

为什么 j 应该不同?只有一个j,在Shape中声明。当您从 Shape 派生时,您不会添加更多的 j,需要在 中声明一些 j线也是。另一方面,你有单独的 obj 用于 ShapeLine,所以这就是你的程序打印的原因

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

关于c++ - 基类指针只得到一个派生类变量值而不是基类变量值为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33815500/

相关文章:

android - Gradle:如何让产品口味从 src/main 继承,除了一个

search - 使用Elasticsearch搜索多态数据

java - 抽象类中的具体方法可以返回子类中定义的变量吗?

C# 多态性

c++ - 自午夜以来的秒数

c++ - 每当我调试时出现几个错误

c# - 组合两个类的成员选择器表达式

c++ - 我无法让这个字符串在 C++ 中工作

c++ - odeint (c++) - 下采样观察

python - 使用子类中的属性覆盖父类中的字段