谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车

yndfcd 2009-01-06 02:44:41
加精
这是一个不合逻辑的东西,个人认为这是C++的缺陷之一,当然不同的人有不同的看法.

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

#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
...全文
10701 265 打赏 收藏 转发到动态 举报
写回复
用AI写文章
265 条回复
切换为时间正序
请发表友善的回复…
发表回复
hz张三 2012-07-10
  • 打赏
  • 举报
回复
滥用模板,造成逻辑混乱、理解分歧的典型~~~
qingcairousi 2012-06-04
  • 打赏
  • 举报
回复
用一点点TMP的技巧就能够构造这种继承关系了。
缺陷?那要看从哪个角度了。
灵活和麻烦是一体两面的不是。
ww884203 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

引用楼主 yndfcd 的帖子:
这是一个不合逻辑的东西,个人认为这是C++的缺陷之一,当然不同的人有不同的看法.

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


这完全符合逻辑啊。其实楼上诸位都说得差不多了。derived继承了base,所以const base& r = derived();没有问题。但是vector<base*>继承了vector<derived*>吗?很显然……
[/Quote]
说得很对
liulefirst 2012-03-03
  • 打赏
  • 举报
回复
这贴或了。
gabriel1017 2012-01-09
  • 打赏
  • 举报
回复
我靠,还以为是什么缺陷,点进来浪费我时间
vichal 2011-12-14
  • 打赏
  • 举报
回复
这个看你怎么理解,建议楼主去看effective c++的最新版专门有一节讲这个的。具体实现方法是在template内定义template方法,代码如下。

template<Typename T>
class vector
{
template<Typename O>
vector(vector<O> ov)
{
...
}
}

}
_拂晓 2011-12-06
  • 打赏
  • 举报
回复
gao搞人啊 。。
快乐的小菜鸟 2011-09-25
  • 打赏
  • 举报
回复
学习了 谢谢
pillarhuang 2011-06-30
  • 打赏
  • 举报
回复
“一千个读者眼里有一千个哈姆雷特”
fellatioyzx 2011-06-22
  • 打赏
  • 举报
回复
我只能说是LZ对语义学不了解。
我举一个例子:孩子是人的子类,但是从语义学上讲子类也是不能随意替换的。比如说只有孩子可以进入游乐场,那你就不能说只有人进入游乐场,因为成年人就不可以进。
myme5261314 2011-06-19
  • 打赏
  • 举报
回复
觉得很符合逻辑啊。
signforlin 2011-06-09
  • 打赏
  • 举报
回复
mark
wzz19901226 2011-06-06
  • 打赏
  • 举报
回复
是与不是,只是单纯的定义关系,这只能在C++中的继承才能体现,语言本就不完美,楼主不必执着那个语言完美,要实用解决问题
smaltdd 2011-05-19
  • 打赏
  • 举报
回复
mark
以后详细了解!
LindenJavier 2011-05-18
  • 打赏
  • 举报
回复
我晕。
你用vector来装,vector<base*> 和 vector<derived*> 是两个不同的"类" 不是说 base 是derived的基类 ,vector<base*> 就得是 vector<derived*> 的基类,没有必然联系。
Katy_Perry 2011-05-17
  • 打赏
  • 举报
回复
额,我只是个初学者,请问mark是什么意思啊??
cao_julians 2011-03-28
  • 打赏
  • 举报
回复
只谈题目中的逻辑:
汽车是类--是一个集合概念,集中了共性,
一个公共汽车是对象--是一个个体概念,突出了特性,
一个公共汽车与汽车是元素“是----属于”集合的关系,并不是“是----等于”的关系。
如果将这个“是”理解为“等于”,就得到了LS的意思。但是实际上“是”理解为“属于”,就没有问题了,一辆公共汽车“属于”汽车,任意辆公共汽车也都“属于”汽车
zicheng_lin 2011-03-13
  • 打赏
  • 举报
回复
比如说 有一个 头类 眼睛类 鼻子类 耳朵类,这里眼睛 鼻子 耳朵 逻辑上属于 头类,就不应该用类的继承,而要用类的组合
woaiaabbc 2011-02-14
  • 打赏
  • 举报
回复
看来我比编译器还迷茫
oscargee 2010-05-12
  • 打赏
  • 举报
回复
刚刚试了一下,不要用ANY, 只需要用shared_ptr就可以完全实现.

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

using namespace std;

class A {
public:
virtual void printName() { cout<< "I'm A" << endl;}
};

class B : public A{
public:
void printName() { cout<< "I'm B" << endl;}
};

void print_any(boost::shared_ptr<A> a)
{
a->printName();
}

int _tmain(int argc, _TCHAR* argv[])
{
vector<boost::shared_ptr<A>> vecA;
vecA.push_back(boost::shared_ptr<A>(new A()));
vecA.push_back(boost::shared_ptr<A>(new B()));
for_each( vecA.begin(), vecA.end(), print_any);
return 0;
}
加载更多回复(245)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧