c++ - Virtual Destructor Test Fails -
c++ - Virtual Destructor Test Fails -
#include <iostream> #include <string> using namespace std; class base of operations { virtual ~base() = default; }; class derived1 : protected base of operations {}; class derived2 : protected derived1{}; class derived3 : protected derived2{}; int main() { base* b[] = {new base, new derived1, new derived2, new derived3}; delete[] b; cin.get(); homecoming 0; }
this gives me next compilation errors , next taught:
warning 1 warning c4624: 'derived1' : destructor not generated because base of operations class destructor inaccessible or deleted
warning 2 warning c4624: 'derived2' : destructor not generated because base of operations class destructor inaccessible or deleted
warning 3 warning c4624: 'derived3' : destructor not generated because base of operations class destructor inaccessible or deleted
error 4 error c2243: 'type cast' : conversion 'derived1 *' 'base *' exists, inaccessible
error 5 error c2243: 'type cast' : conversion 'derived2 *' 'base *' exists, inaccessible
error 6 error c2243: 'type cast' : conversion 'derived3 *' 'base *' exists, inaccessible
warning 7 warning c4154: deletion of array expression; conversion pointer supplied
8 intellisense: conversion inaccessible base of operations class "base" not allowed
9 intellisense: conversion inaccessible base of operations class "derived1" not allowed
10 intellisense: conversion inaccessible base of operations class "derived2" not allowed
issue 1
put destructor in public section of base.
class base of operations { virtual ~base() = default; }; is equivalent to:
class base of operations { private: virtual ~base() = default; }; change to:
class base of operations { public: virtual ~base() = default; }; issue 2
base* b[] = {new base, new derived1, new derived2, new derived3}; constructs objects using new operator 3 times. need phone call delete 3 times -- 1 time each pointer.
instead of
delete[] b; use
delete b[0]; delete b[1]; delete b[2]; issue 3
to able use
base* p = new derived1; you have create base public base of operations class of derived1, not protected.
change
class derived1 : protected base of operations {}; class derived2 : protected derived1{}; class derived3 : protected derived2{}; to
class derived1 : public base of operations {}; class derived2 : public derived1{}; class derived3 : public derived2{}; c++
Comments
Post a Comment