谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车,该怎么解决
谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车
这是一个不合逻辑的东西,个人认为这是C++的缺陷之一,当然不同的人有不同的看法.
C++并不是像我想像中的那么完美.
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++并不是像我想像中的那么完美.
- 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理解错误。把容器去掉就没有问题,有了容器就不是那么回事了。容器本身还有自己的属性
------解决方案--------------------
------解决方案--------------------
模板是用来实现静态多态的。就是相同的代码,在实例化后,变成了不同的东西。
------解决方案--------------------