C++ 当强制转换到父类对象而不是引用时,会出现什么不良结果?

C++ 当强制转换到父类对象而不是引用时,会出现什么不良结果?,c++,casting,polymorphism,C++,Casting,Polymorphism,这段代码是由Bruce Eckel在他的书《用C++思考》第14章第649页中编写的。我不明白的是他在下面的评论[强调补充]: 操作员是,这没问题。父代和子代是多态的。作为Child inherit的客户端,您可以将子对象&强制转换为父对象& 在expressionos中,不希望出现的结果是编译器必须创建子对象父部分的临时副本,将对该临时对象的引用传递给插入器,然后销毁该临时对象。这是一个很大的搅动 而且,正如@NeelBasu所暗示的,如果Parent具有在Child中重写的虚拟函数,那么从插

这段代码是由Bruce Eckel在他的书《用C++思考》第14章第649页中编写的。我不明白的是他在下面的评论[强调补充]:


操作员是,这没问题。父代和子代是多态的。作为Child inherit的客户端,您可以将
子对象&
强制转换为
父对象&


在expression
os中,不希望出现的结果是编译器必须创建子对象父部分的临时副本,将对该临时对象的引用传递给插入器,然后销毁该临时对象。这是一个很大的搅动


而且,正如@NeelBasu所暗示的,如果
Parent
具有在
Child
中重写的虚拟函数,那么从插入器调用这些函数将不会调用
Child
版本,因为传入的对象是
Parent
对象。

这可能是对象切片的意思。也就是说,通过将对象复制到父类的实例中(而不是指定引用),将丢失对象的某些部分

另外,请查看此问题的答案:


下面是一个例子:(参见)

#包括
使用名称空间std;
结构父级{
虚拟常量char*hi()常量{return“我是你的父亲…”;}
};
结构子级:公共父级{
常量char*hi()常量{返回“不行!”;}
};
int main(){
儿童c;

虽然问题中没有重复,但我认为OP所问的是标题:“那些不受欢迎的结果是什么?”也就是说,在他引用的书中的一句话中,“如果你将其转换为基类对象而不是引用”,会出现什么不受欢迎的结果。很抱歉,但在本书的示例中,基类子类中没有虚拟函数。我的意思是,基类父类中没有虚拟函数。@Plato这显然只是这种类型的强制转换可能产生的不良副作用的一个示例。我只是不确定这是否是作者想要说的。请注意rator@Plato作者通常不会在这种特定情况下说。但可能会有更多的效果。因为演员组就是这么说的:
(父)which
创建一个新对象;
(父&)which
创建对
which
的引用。
#include <iostream>
using namespace std;

class Parent
{
    int i;

    public:

    Parent(int ii) : i(ii) { cout << "Parent(int ii)\n"; }
    Parent(const Parent& b) : i(b.i) { cout << "Parent(const Parent&)\n"; }
    Parent() : i(0) { cout << "Parent()\n"; }

    friend ostream& operator<<(ostream& os, const Parent& b) { 
        return os << "Parent: " << b.i << endl; 
    }
};

class Member
{
    int i;

    public:

    Member(int ii) : i(ii) { cout << "Member(int ii)\n"; }
    Member(const Member& m) : i(m.i) { cout << "Member(const Member&)\n"; }

    friend ostream& operator<<(ostream& os, const Member& m) { 
        return os << "Member: " << m.i << endl; 
    }
};

class Child : public Parent
{
    int i;
    Member m;

    public:

    Child(int ii) : Parent(ii), i(ii), m(ii) { cout << "Child(int ii)\n"; }

    friend ostream& operator<<(ostream& os, const Child& c) { 
        return os << (Parent&)c << c.m << "Child: " << c.i << endl; 
    }
};

int main()
{
    Child c(2);
    cout << "calling copy-constructor: " << endl;
    Child c2 = c;
    cout << "values in c2:\n" << c2;
}
#include <iostream>
using namespace std;

struct parent {
  virtual const char* hi() const { return "I'm your father..."; }
};

struct child : public parent {
  const char* hi() const { return "No way!"; }
};

int main() {
  child c;
  cout << ((parent) c).hi() << endl;
  cout << ((parent&)c).hi() << endl;
}