多态性使用向量与多态性使用数组之间的差异 P>基于更有效的C++ 项目3:不要对数组进行多态性< >,避免多态地处理数组。

多态性使用向量与多态性使用数组之间的差异 P>基于更有效的C++ 项目3:不要对数组进行多态性< >,避免多态地处理数组。,c++,boost,C++,Boost,那么,为什么我们可以使用std::vector来保存指向基类的指针而没有问题呢 多谢各位 #include <iostream> #include "boost/shared_ptr.hpp" #include <vector> class BaseClass { public: virtual void PrintMe() const { std::cout << "BaseClass" << std::endl;

那么,为什么我们可以使用
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 . . .
#包括
#包括“增压/共享_ptr.hpp”
#包括
类基类{
公众:
虚空PrintMe()常量{

std::cout关于
std::vector
没有什么神奇之处。

关于
std::vector
没有什么神奇之处。
std::vector
拥有基类指针的常规数组也会有同样的效果。

使用数组或向量来拥有指向pol的指针是很好的多形类型

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

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

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

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

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

这是说你不应该这样做:

Base array[N];
array[0] = Derived1();
array[1] = Derived2();
将这些衍生对象放置在阵列中时,将对其进行切片

对于标准容器,如,完全相同。对于C++中的多态行为,需要使用指针:

std::unique_ptr<Base> array[N];
array[0].reset(new Derived1());
array[1].reset(new Derived2());
std::unique_ptr数组[N];
数组[0]。重置(新的Derived1());
数组[1]。重置(新的Derived2());

这是说你不应该这样做:

Base array[N];
array[0] = Derived1();
array[1] = Derived2();
将这些衍生对象放置在阵列中时,将对其进行切片

对于标准容器,如,完全相同。对于C++中的多态行为,需要使用指针:

std::unique_ptr<Base> array[N];
array[0].reset(new Derived1());
array[1].reset(new Derived2());
std::unique_ptr数组[N];
数组[0]。重置(新的Derived1());
数组[1]。重置(新的Derived2());
问题在于:

struct base {
    int element;
};

struct derived : base {
    int another_element;
};

void f(base *p) {
    std::cout << (void*)&p[1] << '\n';
}

int main() {
    derived array[20];
    std::cout << (void*)&array[1] << '\n';
    f(array);
    return 0;
}
struct base{
int元素;
};
派生结构:基{
int另一个_元素;
};
空f(基*p){
问题是:

struct base {
    int element;
};

struct derived : base {
    int another_element;
};

void f(base *p) {
    std::cout << (void*)&p[1] << '\n';
}

int main() {
    derived array[20];
    std::cout << (void*)&array[1] << '\n';
    f(array);
    return 0;
}
struct base{
int元素;
};
派生结构:基{
int另一个_元素;
};
空f(基*p){

std::没什么区别。你也可以将指针存储在数组中。文本可能是关于不直接在数组中存储不同类型的对象。这对向量也不起作用。我的问题是将基类的不同子类的指针存储到容器中。数组多态性对我来说听起来很奇怪。哟当它显然是一个副词时,你用多态性作为名词?@thang:如果你无意中发现一个词,大多数句子听起来都有点奇怪。没有区别。你也可以将指针存储在数组中。文本可能是关于不直接在数组中存储不同类型的对象。这对向量也不起作用。我的问题是关于将基类的不同子类的指针存储到容器中。数组多态性对我来说听起来很奇怪。当它明显是副词时,你将多态性用作名词?@thang:如果你无意中发现一个单词,大多数句子听起来都有点奇怪。我的问题是关注多态性。@q0987:数组在多态性方面存在问题。@q0987:e与vector的问题相同。我的问题是关注多态性。@q0987:数组与多态性的问题与vector的问题相同。