为什么';t这段代码在c++;? 为什么这个C++代码不工作?它意味着动态地将基类强制转换为派生类。我将如何实现这一点 class base { public: int x = 0; }; class a : public base { public: char c = 'a'; }; class b : public base { public: long int d = 'b'; }; std::vector<base> vec; for (int i = 0; i < 5; i++) { b temp; vec.push_back(temp); } for (int i = 0; i < 5; i++) { b* temp = (b*)&vec[i]; std::cout << temp->d << std::endl; } 类基{ 公众: int x=0; }; a类:公共基地{ 公众: 字符c='a'; }; b类:公共基地{ 公众: 长整型d='b'; }; std::vec; 对于(int i=0;i的对象,但不是C++中如何实现动态多态性< /代码>。
每当你将为什么';t这段代码在c++;? 为什么这个C++代码不工作?它意味着动态地将基类强制转换为派生类。我将如何实现这一点 class base { public: int x = 0; }; class a : public base { public: char c = 'a'; }; class b : public base { public: long int d = 'b'; }; std::vector<base> vec; for (int i = 0; i < 5; i++) { b temp; vec.push_back(temp); } for (int i = 0; i < 5; i++) { b* temp = (b*)&vec[i]; std::cout << temp->d << std::endl; } 类基{ 公众: int x=0; }; a类:公共基地{ 公众: 字符c='a'; }; b类:公共基地{ 公众: 长整型d='b'; }; std::vec; 对于(int i=0;i的对象,但不是C++中如何实现动态多态性< /代码>。,c++,C++,每当你将b的对象推入Base对象的vectorvec时,你就从temp创建另一个纯Base类型的对象。你可能在思考(你是不对的!)存储在向量中的元素将是类型基,但它将持有一个类型< b>代码>的对象,但不是C++中如何实现动态多态性< /代码>。 声明: std::vector<Base> vec; // 1 b temp; // 2 vec.push_back(temp); // 3 编辑: 对象切片也是问题的解决方案。对象切片是这类问题的正确
b
的对象推入Base
对象的vectorvec
时,你就从temp
创建另一个纯Base
类型的对象。你可能在思考(你是不对的!)存储在std::vector<Base> vec; // 1
b temp; // 2
vec.push_back(temp); // 3
编辑:
对象切片也是问题的解决方案。对象切片
是这类问题的正确关键字。以下是对象切片的详细说明
对象切片发生在将派生类对象指定给基类对象时,派生类对象的附加属性被切片以形成基类对象
我引用了下面的一个答案。请看这篇文章,并通过一些代码片段获得最佳解释和可能的解决方案。请看这篇文章,它解释了在基类向量中推导出类的对象时的问题
“切片”是指将派生类的对象分配给基类的实例,从而丢失部分信息,其中一些信息被“切片”掉
比如说,
class A {
int foo;
};
class B : public A {
int bar;
};
因此,类型B的对象有两个数据成员,foo和bar
那么如果你要写这个:
B b;
A a = b;
然后,b中关于成员栏的信息在a中丢失
您的问题是由<强>对象切片< /St> >引起的。您期望<>代码> BASE>代码>是<强>引用类型,它将在C++或java中,但实际上,它是一个<强>值类型C++/P> :
C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据 代码中实际发生的情况:您将b
的实例推送到向量
。由于类b
不是类基
,将使用隐式生成的复制构造函数在向量中创建基
的新实例,但只有b
实例的基部分将被复制ed,因此从b
实例“切片”成员d
解决方案是存储指向base
的指针。因此,在您的情况下,向量应该存储原始(base*
)或托管(unique_ptr
或shared_ptr
)指针(与原始指针相比,更喜欢托管指针)。它可以工作,因为如果通过b*
或base*
引用内存中b
的实例并不重要,它仍然指向相同的b
对象
#包括//endl,cout
#包括//make_unique,unique_ptr
#包含//向量
阶级基础{
公众:
int x=0;
};
a类:公共基地{
公众:
字符c='a';
};
b类:公共基地{
公众:
长整型d='b';
};
int main(){
std::vec;
对于(int i=0;i<5;i++){
向量推回(std::make_unique());
}
对于(int i=0;i<5;i++){
常量b*temp=static_cast(vec[i].get());
std::cout d Read up on.我甚至想把它称为那篇文章的副本。我相信它没有定义的行为。可能是错误的。@Chipsterstd::vector
存储类型为base
的元素。重新解释转换为b
肯定是U.b.;-)@StoryTeller UnslanderMonica它更像是S也很接近。AbHiRoRa-你没有停下来考虑为什么指针只在这里工作吗?当然,切片是个问题。
B b;
A a = b;