关于virtual ,这是什么原因? 大家讨论一下?
//////////////////////////////////////////////////////////////////////////////////////
//
// FileName : test.cpp
// Version : 1.0
// Creater :
// Date : 2003-12-2 11:51:50
// Comment :
//
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/*#ifdef _DEBUG
inline void * _cdecl operator new (unsigned int size, const char *file,int line)
{
};
inline void *_cdecl operator delete (void *p)
{
};
#endif */
using namespace std;
class A
{
public:
A()
{
ptra_ = new char[10];
}
virtual ~A()
{
cout<<"A destructor!";
foo();
delete[] ptra_;
} // 非虚析构函数
void bar()
{
foo();
}
private:
char * ptra_;
virtual void foo()
{
cout<<" A::foo()!"<<endl;
}
};
class B: public A
{
public:
B()
{
ptrb_ = new char[20];
}
int Result = false;
int nRetCode = false;
//Exit1: // sucess exit
Result = true;
Exit0: // fail exit
return Result;
virtual ~B()
{
cout<<"B destructor!";
foo();
delete[] ptrb_;
}
void bar()
{
foo();
}
private:
char * ptrb_;
virtual void foo()
{
cout<<" B::foo()!"<<endl;
}
};
void main()
{
int aSize,bSize;
aSize = sizeof(A);
bSize = sizeof(B);
cout << " aSize = "<< aSize << " bSize =" << bSize <<endl;
A * a = new B;
a->bar();
aSize = sizeof(*a);
bSize = sizeof(a);
cout << " aSize = "<< aSize << " bSize =" << bSize <<endl;
delete a;
}
析构函数使用了多态,一般普通函数是只会执行B的函数
为何析构都执行.好像是关于调用链的问题
问题点数:20、回复次数:6Top
1 楼hawkxjy(developer)回复于 2003-12-02 15:04:34 得分 5
楼主对继承对象的构造理解不够,子类对象构造时是先用基类构造函数构造一次然后用子类的构造函数构造一次,以保证变量的初始化;所以在析构时是先调用子类的析构一下,再用继类的析构一下,以保证所有动态创建的变量销毁。
所以析构函数都执行。Top
2 楼holy198048(holy)回复于 2003-12-03 10:12:12 得分 0
但是关于重载,基类中的函数和继承类之间好像不能够重载.
A *a = new B
A *a = new A
B *b = new B
之间有何区别?
还有> 我也知道在子类构造之前,会先构造基类,那为何大小还是原来的.Top
3 楼E17(守护星)回复于 2003-12-03 10:24:05 得分 5
什么叫 大小也是原来的
我看了一下 sizeof(A) = 0x00000008 = pvtable+ ptra
sizeof(B) = 0x0000000c = pvtable +ptra +ptrb
Top
4 楼byyyyy(苦行僧【苦】)回复于 2003-12-03 10:36:01 得分 5
先回答你:”但是关于重载,基类中的函数和继承类之间好像不能够重载.”问题
这里void bar()
{
foo();
}
是隐藏。
隐藏的条件是:
派生类函数和基类函数名相同,参数也相同。但基类函数无virtual关键字。此时基类函数被隐藏。注意不要和覆盖混爻。因为覆盖是有关键字virtual的。
重载是在相同的范围。比如在同样一个类中。函数名相同,但是参数不通。通过判断参数的数目和顺序及类型,来达到同一个函数调用多个版本。
下面的问题,我还要想想。Top
5 楼byyyyy(苦行僧【苦】)回复于 2003-12-03 10:44:27 得分 5
A *a = new B
比如用此时定义的a去调用虚函数,那么将调用B中的虚函数。因为虚函数的访问控制并不取决于对象指针所指向的类,而且取决于调用虚函数对象指针所指的类。
A *a = new A
这个就没什么说法了,该怎么调用就怎么调用。
B *b = new B
同上Top
6 楼holy198048(holy)回复于 2003-12-04 09:33:44 得分 0
感谢大家,对于虚函数和继承现在清楚多了Top




