多态地使用矢量多态与阵列之间的差异

q09*_*987 1 c++ boost

基于更有效的C++ 第3项:永远不要多态地处理数组,我们应该避免多态地处理数组.

那么为什么我们可以使用std::vector指针指向基类而没有问题呢?

谢谢

#include <iostream>
#include "boost/shared_ptr.hpp"
#include <vector>

class BaseClass {
public:
    virtual void PrintMe() const {
        std::cout << "BaseClass" << std::endl;
    }
    virtual ~BaseClass() {}
};

class SubClass : public BaseClass {
public:
    virtual void PrintMe() const {
        std::cout << "SubClass" << std::endl;
    }
};

int main()
{
    std::vector<boost::shared_ptr<BaseClass> > vecPtrs;
    boost::shared_ptr<BaseClass> shp1(new BaseClass);
    vecPtrs.push_back(shp1);

    boost::shared_ptr<BaseClass> shp2(new SubClass);
    vecPtrs.push_back(shp2);

    for (size_t i = 0; i < vecPtrs.size(); ++i)
    {
        vecPtrs[i]->PrintMe();
    }
}

// Output:

BaseClass
SubClass
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 10

可以使用数组或向量来保存指向多态类型的指针.

问题是如果您尝试以多态方式处理对象数组.通过指针访问数组使用指针类型来确定数组对象的大小,如果指针类型与对象类型不匹配,则会出现严重错误.

Base * stuff = new Derived[10]; // No compile error: pointer conversion is allowed
stuff[2].do_something();        // Still no compile error, but weird runtime errors.
Run Code Online (Sandbox Code Playgroud)