如何解决从标准库容器继承会导致切片
我遇到了一个旧的SO post about inheriting from std::vector。发表的评论之一对我来说还不清楚,当您从标准库容器继承并使用指向基的指针/引用时,为什么会发生切片?
#include <vector>
#include <iostream>
using namespace std;
class MyVec : public vector<int>
{};
void printTypeBase(vector<int>& vecObj)
{
cout << "base parameter ref: " << typeid(vecObj).name() << endl;
}
void printTypeDerived(MyVec& vecObj)
{
cout << "derived parameter ref: " << typeid(vecObj).name() << endl;
}
int main()
{
auto myVec = MyVec{};
printTypeBase(myVec);
printTypeDerived(myVec);
}
输出:
基本参数参考:St6vectorIiSaIiEE
派生参数参考:5MyVec
当我尝试在printTypeBase
内部进行dynamic_cast时:
auto temp = dynamic_cast<MyVec&>(vecObj);
错误:“ std :: vector
”不是多态的
回想起来,我的问题应该是为什么std::vector
不是多态类型?
解决方法
标准库容器没有虚拟方法,也没有虚拟析构函数。他们完全没有一个vtable。
您的代码无法测试您要测试的内容。
,这里没有切片,但是,对于非多态类型的引用(例如,没有虚拟方法的类),typeid
解析为参数的静态类型信息,而不是动态类型。
为什么会切片
您的示例中没有切片。对于标准库容器,没有什么比从任何其他类型继承更能引起切片的。
基本参数参考:St6vectorIiSaIiEE
错误:“ std :: vector
”不是多态的
后一个错误说明了typeid
的结果。向量不是多态类型。这是因为它没有虚拟功能。 dynamic_cast
仅适用于多态类型,typeid
仅在引用多态类型时才解析为动态类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。