微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从标准库容器继承会导致切片

如何解决从标准库容器继承会导致切片

我遇到了一个旧的SO post about inheriting from std::vector。发表的评论之一对我来说还不清楚,当您从标准库容器继承并使用指向基的指针/引用时,为什么会发生切片?

Godbolt

#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 举报,一经查实,本站将立刻删除。