C++ C++;强制转换自定义类的非指针实例

C++ C++;强制转换自定义类的非指针实例,c++,pointers,casting,polymorphism,subclass,C++,Pointers,Casting,Polymorphism,Subclass,假设我有一个类A,它有一个子类B class A { public: A(){}; } class B : public A { public: B(int value){ foo = value }; int foo; } B是a的一个子类,带有int-foo 好的,现在让我们假设我做以下事情: std::vector<A> mylist; B myB(5); //Create a new instance of class B mylist.push

假设我有一个类A,它有一个子类B

class A 
{
public:
    A(){};
}

class B : public A
{
public:
    B(int value){ foo = value };
    int foo;
}
B是a的一个子类,带有int-foo

好的,现在让我们假设我做以下事情:

std::vector<A> mylist;
B myB(5); //Create a new instance of class B
mylist.push_back(myB); //Add b to my vector of A.
我曾在我的项目中尝试过这样做,但如果我打印出foo的值,它将是不正确的:

std::cout<<instance->foo<<std::endl; // This does not give me 5. It gives me a garbage number.

<代码> STD::CUT

这是C++中的切片问题的典型例子。


您应该将指针存储在向量中,以便轻松避免它们。如果不想处理原始指针,请使用智能指针。

< P>这是C++中的切片问题的典型例子。
您应该将指针存储在向量中,以便轻松避免它们。如果您不想处理原始指针,请使用智能指针。

当您编写
mylist时。push_back(myB)
,会出现一个切片。
mylist
存储
A
对象。因此,您的
B
被转换为
A
,丢失了
B
中的所有内容,而不是
A
。只存储
A
。你无法找回丢失的碎片

这与执行以下操作相同:

B myB(5);
A a(myB);
为了具有多态行为,您需要将
A
设置为多态类,并通过指针引用对象,即
A*

因此,您需要向
A
添加至少一个虚拟函数(虚拟析构函数将是一个好主意),并拥有向量存储指针。例如:

std::vector< A* > mylist;
mylist.push_back( new myB(5) );
B *instance = dynamic_cast<B *>(mylist[0]);

当您编写mylist.push_back(myB)时,会出现一个切片。
mylist
存储
A
对象。因此,您的
B
被转换为
A
,丢失了
B
中的所有内容,而不是
A
。只存储
A
。你无法找回丢失的碎片

这与执行以下操作相同:

B myB(5);
A a(myB);
为了具有多态行为,您需要将
A
设置为多态类,并通过指针引用对象,即
A*

因此,您需要向
A
添加至少一个虚拟函数(虚拟析构函数将是一个好主意),并拥有向量存储指针。例如:

std::vector< A* > mylist;
mylist.push_back( new myB(5) );
B *instance = dynamic_cast<B *>(mylist[0]);

好吧,现在让我们假设我做以下事情:
不要。既然你不应该这样做,你的问题的其余部分就成了一个没有意义的问题。^那么我正试图找出正确的方法来投射一个非指针…如果你的向量包含一个对象,那么它可能会重复,那么它应该只知道一个对象。假设您现在将向量更改为包含指向对象的指针。尽管如此,向量应该只知道指针,您应该只使用接口。所以我的意思是你应该重新考虑你的设计。可能会引入虚拟函数。没有正确的方法。
好吧,现在让我们假设我做以下操作:
不要。既然你不应该这样做,你的问题的其余部分就成了一个没有意义的问题。^那么我正试图找出正确的方法来投射一个非指针…如果你的向量包含一个对象,那么它可能会重复,那么它应该只知道一个对象。假设您现在将向量更改为包含指向对象的指针。尽管如此,向量应该只知道指针,您应该只使用接口。所以我的意思是你应该重新考虑你的设计。可能会引入虚拟功能。没有正确的方法。什么是切片?我有没有办法不用指针就这样做?@lizusek:但是类型字段会有什么帮助?推送时仍会发生切片。什么是切片?我有没有办法不用指针就这样做?@lizusek:但是类型字段会有什么帮助?推动时仍会发生切片。