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