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