Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';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++ - Fatal编程技术网

为什么';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
对象的vector
vec
时,你就从
temp
创建另一个纯
Base
类型的对象。你可能在思考(你是不对的!)存储在向量中的元素将是类型基,但它将持有一个类型< <代码> b>代码>的对象,但不是C++中如何实现<代码>动态多态性< /代码>。 声明:

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.我甚至想把它称为那篇文章的副本。我相信它没有定义的行为。可能是错误的。@Chipster
std::vector
存储类型为
base
的元素。重新解释转换为
b
肯定是U.b.;-)@StoryTeller UnslanderMonica它更像是S也很接近。AbHiRoRa-你没有停下来考虑为什么指针只在这里工作吗?当然,切片是个问题。
B b;
A a = b;