数组多态问题!!!

leebao_csdn 2001-11-07 01:25:30
源程序如下:
#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base() { cout<<"Base dec"<<endl; };
};
class Derived : public Base
{
public:
~Derived() { cout<<"Derived dec"<<endl; };
};

void delArray(Base a[])
{
delete[] a;
}

void main()
{
Base* da = new Derived[1];
delArray(da);
}
(1)C++ builder之输出:
Base dec
(2)vc++之输出:
Derived dec
Base dec
到底谁对谁错?
我看了More Effective c++一书中的第三条,感觉一塌糊涂!请高手解答!
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_wyq 2001-11-09
  • 打赏
  • 举报
回复
看看inside the c++ object model你就知道了,因为你这种写法编译器的sizeof会算错!
shornmao 2001-11-09
  • 打赏
  • 举报
回复
to reinly(老姜)
按照C++ ISO来说,
new []的时候不保证调用构造函数,delete []的时候不保证调用析构函数。
但是某些积极的编译器,会实现这个功能。
在积极度方面,VC大多做得不错。
magicblue 2001-11-07
  • 打赏
  • 举报
回复
new分配的内存必须用delete释放
tangjiang 2001-11-07
  • 打赏
  • 举报
回复
我把leebao_csdn的主程序
void main()
{
Base* da = new Derived[1];
// delArray(da);
}
delArray(da)注释掉以后,
怎么什么输出都没有?
析构函数不是自动调用吗?先谢了。
reinly 2001-11-07
  • 打赏
  • 举报
回复
个人认为是VC对

因为虽然指针是指向BASE类的但是初始话的时候是将其转换为base的继承类Derived的
Base* da = new Derived[1];
可以分解为
Base *da;
da=new Derived[1];
Nizvoo 2001-11-07
  • 打赏
  • 举报
回复
真是不懂。来学习。
c++是一种语言,而bcb或是vc++是以这种支持这种语言的编绎器。
呵呵。
原来是这样。
我一般认为c等于turbo c 2.0
c++ 等于 VC++ 或是c ++ builder
magicblue 2001-11-07
  • 打赏
  • 举报
回复
同意shornmao
这并不能说是BCB有错,关键在于delete的标准实现方式(见《Inside C++ Object Model》)。VC正确可见MS对delete的实现做了手脚。
另外这里没有切割的问题吧
azs 2001-11-07
  • 打赏
  • 举报
回复
"不能说是BCB有问题!"

为什么?

按ec++所说,把dctr声明为vf,就不该被切割!
hello_wyq 2001-11-07
  • 打赏
  • 举报
回复
你编写的程序有问题,不能说是BCB有问题!
象你这样的传值的话,就不会有多态!子类要被切割!
BCB和CFRONT一样!如果说VC可以的话,只能说你真是一个幸运的coder:)
shornmao 2001-11-07
  • 打赏
  • 举报
回复
你忽略了一点,这与析够函数是否多态无关,而是在于对delete []的处理,在这一方面,C++标准规定,delete []并不一定被要求调用每一个数组成员的析够函数,不同的编译器会有自己的处理方式,在Effective C++中提到的,至于为什么会调用base的析构,我也不知道。
所以此书中提到,安全的对象数组的析构方式是
for (i=0;i<array_size;i++)
delete a[i];
只能说VC和GnuC/C++在这方面处理得更好,但是似乎不能指责BCC违背了C++ ISO。
chxr 2001-11-07
  • 打赏
  • 举报
回复
就问题而言。结果是VC的对:我们当然希望通过数组名能实现多态。
不过首先申明不是工具之争。恩。据我知道:VC可以显示的CALL ctor:
base a;
a.base::base();
这也是一个bug..
wxz 2001-11-07
  • 打赏
  • 举报
回复
to:点点思忆
这是编译器对齐处理不同的差异,可以在cb中设置按字节对齐,结果就一样了,其默认是quat word对齐(8字节)
leebao_csdn 2001-11-07
  • 打赏
  • 举报
回复
顺便,总觉得c++builder怪怪的。
看如下程序:
#include <iostream>
using namespace std;
class b{};
void main()
{
cout<<sizeof(b)<<endl;
}
在vc和g++上结果都为1(《深度探索c++对象模型》一书中介绍)。可是在c++builder中,其结果为8!!!为什么???
leebao_csdn 2001-11-07
  • 打赏
  • 举报
回复
我也认为vc对。可是看如下情况:
添加一个函数
void printArray(Base a[],int c)
{
for(int i = 0 ; i < c ; i++)
a[i].print();
}
然后在Base里添加函数:
virtual void print() { cout<<"Base print"<<endl; };
同样在Derived里添加函数:
void print() { cout<<"Derived print"<<endl; };
并且在main里调用printArray:
printArray(da);

程序执行结果在vc和cb中是完全一样的(我的意思是printArray函数)。由此可表明,c++builder也可以实现数组多态,只不过不知道为什么其析构却如此愚蠢。
bdsc 2001-11-07
  • 打赏
  • 举报
回复
vc对

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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