我阅读了 C++ 中的切片问题,并尝试了一些示例(我来自 Java 背景)。不幸的是,我不理解某些行为。目前,我被困在这个例子中(来自 Efficent C++ 第三版的替代例子)。有人可以帮我理解吗?
我的简单父母类:
class Parent
{
public:
Parent(int type) { _type = type; }
virtual std::string getName() { return "Parent"; }
int getType() { return _type; }
private:
int _type;
};
我的一个孩子的简单班级:
class Child : public Parent
{
public:
Child(void) : Parent(2) {};
virtual std::string getName() { return "Child"; }
std::string extraString() { return "Child extra string"; }
};
主要的:
void printNames(Parent p)
{
std::cout << "Name: " << p.getName() << std::endl;
if (p.getType() == 2)
{
Child & c = static_cast<Child&>(p);
std::cout << "Extra: " << c.extraString() << std::endl;
std::cout << "Name after cast: " << c.getName() << std::endl;
}
}
int main()
{
Parent p(1);
Child c;
printNames(p);
printNames(c);
}
执行后我得到:
姓名:家长
姓名:家长
Extra:子额外字符串
演员后姓名:家长
我理解前两行,因为它是“切片”的原因。但我不明白为什么我可以通过静态演员把孩子变成父母。书中写到,切片后,所有的专业信息都会被切掉。所以我想,我不能将p转换为c,因为我没有信息(在函数 printNames 的开头,创建了一个没有附加信息的新 Parent 对象)。
另外,如果演员表成功,为什么我得到“演员表后姓名:父母”而不是“演员表后姓名:孩子”?