谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车,该怎么解决

谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车
这是一个不合逻辑的东西,个人认为这是C++的缺陷之一,当然不同的人有不同的看法.

C++并不是像我想像中的那么完美.

C/C++ code
#include <vector>
using std::vector;

class base{};

class derived : public base{};

void foo( vector<base*> v )
{

}

int main( int argc, char* argv )
{
    vector<derived*> vd;
    foo( vd );
}



1>e:\my projects\stlex1\contypetest\main.cpp(16) : error C2664: 'foo' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'std::vector<_Ty>'
1> with
1> [
1> _Ty=derived *
1> ]
1> and
1> [
1> _Ty=base *
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

------解决方案--------------------
不要把编译器想得这么智能


------解决方案--------------------
这应该不是一堆汽车的问题,应该说是两个不同的装汽车的箱子。就像你用参数char a[4],你就不能用char a[5]传过去一样。
------解决方案--------------------
这个帖子挺有意思的。

我觉得也可以这样来理解:
我们买了几团毛线,其中一部分织成毛衣,另一部分织成了毛裤。然而,我们却不能说毛线、毛衣、毛裤都是一样的东西。

vector是用来组合一组相同类型的数据的容器,组合和继承的差别就在于ISA关系不能继续。

如果这样:
C/C++ code
class CarsList
{
   vector<Car *> m_cars;
public:
   ...
   virtual BuyCar(){m_cars.push_back(new Car);}
};
class BusesList: public CarsList
{
public:
   virtual BuyCar(){m_cars.push_back(new Bus);}
};

------解决方案--------------------
这和你用中文的语意描述有关.
这里修饰的是vector,元素不同的两个vector,两个不同的类.它们之间并无继承关系.
话说回来,本就没有完美的语言,C++也并不例外.
------解决方案--------------------
C/C++ code

一堆公共汽车应该是

#include <vector>
using std::vector;

class base{};

class derived : public base{};

void foo(base* vb, size_t num)
{

}

int main( int argc, char* argv )
{
    derived* vd = new derived[10];
    foo( vd, 10 );
}



当你使用vector<>的时候,它就不只只是一堆公共汽车了,因为它除了包含一堆公共汽车外,还包含了别的属性,比如大小,容量

------解决方案--------------------
现实中物件间的关系可不止一个简单的“是”关系。
想把所有关系都套到“是”关系上,到处碰壁也就不奇怪了。
------解决方案--------------------
我倒是觉得这个是属于容器类自己的问题。
C/C++ code

#include <vector>
using std::vector;

class base{};

class derived : public base{};

//void foo( vector<base*> v )
void foo( base v[] )
{

}

int main( int argc, char* argv )
{
    derived vd[10];
    foo( vd );
}

------解决方案--------------------
LZ理解错误。把容器去掉就没有问题,有了容器就不是那么回事了。容器本身还有自己的属性
------解决方案--------------------
探讨
C/C++ code一堆公共汽车应该是

#include<vector>usingstd::vector;classbase{};classderived :publicbase{};voidfoo(base*vb, size_t num)
{

}intmain(intargc,char*argv )
{
derived*vd=newderived[10];
foo( vd,10);
}



当你使用vector<>的时候,它就不只只是一堆公共汽车了,因为它除了包含一堆公共汽车外,还包含了别的属性,比如大小,容量

------解决方案--------------------
模板是用来实现静态多态的。就是相同的代码,在实例化后,变成了不同的东西。
------解决方案--------------------
探讨
我倒是觉得这个是属于容器类自己的问题。

C/C++ code
#include <vector>
using std::vector;

class base{};