多态性:成员访问和getter给出不同的结果

Rrr*_*Rrr 4 c++ polymorphism object-slicing

这是代码:

#include <iostream>
#include <vector>
#include <array>

class Parent
{
public:
    virtual void whatAmI(){std::cout << "A Parent" << std::endl;}
    virtual long getValue(){std::cout << "value from Parent " << std::endl; return value;}
    long value;
};

class Child : public Parent
{
public:
    virtual void whatAmI(){std::cout << "A child" << std::endl;}
    virtual long getValue(){std::cout << "value from Child " << std::endl; return value;}
    long value;
};

class SomeClass
{
public:
    Parent * parent;
};

int main()
{

Child c = Child();
SomeClass sc;

sc.parent = &c;
sc.parent->value = 10;
sc.parent->whatAmI();

std::cout << sc.parent->value << std::endl;
std::cout << sc.parent->getValue() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它返回:

A child
10
value from Child 
0
Run Code Online (Sandbox Code Playgroud)

我已阅读有关对象切片的信息,并确保在切片后将我分配值10.我仍然不明白为什么直接字段访问和函数调用会给出不同的结果.

谢谢.

Oli*_*rth 6

这里没有切片 - 你通过指针访问.

这种行为是由于成员变量访问不是多态的.所以,parent->value总是指Parent::value,从来没有Child::value.而value(in Child::getValue)指的是Child::value.