Dears,
I have a question regarding the destructor calling mechanism difference between Visual C++ 2005 and Visual C++ 6.0. When i write following code in Visual C++ 6.0 it fails to compile. But when i write it in Visual C++ 2005 it is working well. What could be the reason for this difference The constructor/destructor of virtual base class is called by "most derived class". Here the most derived class is TryDerive and it is derived from class NonDerivable. Class NonDerivable is derived from DisableDerive virtualy. Since the destructor of class DisableDerive is private when the class TryDerive(Most derived class) try to call this function the compile time error is issued by VC++ 6.0 compiler and the VC++ 2005 complile this code and the destructurs are getting called correctly.
Pease see the code below.
class
DisableDerive // A base class{
public
:DisableDerive(){ std::cout<<
"DisableDerive::DisabeDerive()\n"; } // Made the constructor as privateprivate
:~DisableDerive()
{
std::cout<<
"DisableDerive::~DisableDerive()\n";}
friend class NonDerivable; // Made NonDerivable as friend so that it can access private constructor};
class
NonDerivable: virtual protected DisableDerive // Intermediate class - Virtual base{
private
: int m_nVal;public
:NonDerivable()
{
std::cout<<
"NonDerivable::NonDerivable()\n";m_nVal = -1;
}
~NonDerivable()
{
std::cout<<
"NonDerivable::~NonDerivable()\n";}
void SetValue( int nVal ){ m_nVal = 10; }};
class
TryDerive: public NonDerivable // Deriving from non derivable class{
public
:TryDerive()
{
std::cout<<
"TryDerive::TryDerive()\n";}
~TryDerive()
{
std::cout<<
"TryDerive::~TryDerive()\n";}
};
int
main(){
TryDerive a;
return 0;}
Compiler outputs
VC++ 6.0:
--------------------Configuration: CompileTest - Win32 Debug--------------------
Compiling...
CompileTest.cpp
D:\CompileTest\CompileTest.cpp(53) : error C2248: 'DisableDerive::~DisableDerive' : cannot access private member declared in class 'DisableDerive'
D:\CompileTest\CompileTest.cpp(11) : see declaration of 'DisableDerive::~DisableDerive'
Error executing cl.exe.
CompileTest.exe - 1 error(s), 0 warning(s)
VC++ 2005
1>------ Build started: Project: CompileTest, Configuration: Debug Win32 ------
1>Compiling...
1>CompileTest.cpp
1>Linking...
1>Embedding manifest...
1>Build log was saved at "file://c:\Documents and Settings\Amal\My Documents\Visual Studio 2005\Projects\CompileTest\CompileTest\Debug\BuildLog.htm"
1>CompileTest - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Thanks,
Amal P.