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

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -