多态性使用向量与多态性使用数组之间的差异 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的问题相同。