学习继承时发现的问题。。
近日学习继承,发现一个问题。比如下面一个小程序,如果在父类中,把析构函数删掉,就会在LINK时
出现问题。但如果不写析构函数,系统不是自动会分配一个么?
还有一个问题,有地方说,((B*)p)->Print();这样用很不好,那么我如果不改变类,怎样调用Print()才
OK呢?
麻烦您解释的仔细一点,初学C++,谢谢。
#include <iostream.h>
class A
{
public:
A()
{}
~A()
{}
virtual display()
{
cout<<"A"<<endl;
}
};
class B :public A
{
public:
B(){}
//~B(){}
display()
{
cout<<"AB"<<endl;
}
Print()
{
cout<<"B"<<endl;
}
};
void main()
{
A *p;
p=new B ;
((B*)p)->Print();
}
[解决办法]
如果在父类中,把析构函数删掉,就会在LINK时
出现问题。但如果不写析构函数,系统不是自动会分配一个么?
========================================================
应该是你写的程序有点问题所致。如果程序没问题,就不会出现你所说的这种情况,其实,你程序中,即使不写父类的析构函数,系统也会默认生成一个,所以说,没写也没问题的。
还有一个问题,有地方说,((B*)p)- >Print();这样用很不好,那么我如果不改变类,怎样调用Print()才
OK呢?
/////////////////////////////////////////////////////////
上面用到了指针类型的强制转换,如果你不想这样用,可以在父类中将Pring()方法声明为virtual,再在B中重写一个就可以用P来访问类B中的Print()方法了。
[解决办法]
1.你用了new但是没有delete,内存没释放。
2.你的问题 :
///
比如下面一个小程序,如果在父类中,把析构函数删掉,就会在LINK时出现问题。但如果不写析构函数,系统不是自动会分配一个么?
///
我去掉析构函数后在vc6.0下运行没有问题,但是根据c++标准:
***
当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。
*** (参考effective c++ 第14条)
所以即使运行正确,你的程序一些行为也将无法预测,所以最好写上virtual ~A(),不过也许vc自动帮你添加了也说不定
3.((B*)p)- >Print();这样用很不好,那么我如果不改变类,怎样调用Print()才OK呢?
如同2楼的,在父类中写一个virtual,不然你就用你这种方法吧