Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inherit from a class that has the copy constructor deleted

I have class base which only contains private default constructor and public deleted copy constructor, and nothing else.

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};

If I try to inherit from base and create an instance of class derived as below, g++ 4.8.2 doesn't compile my code but VC++ 2013 does.

class derived : public base {
private:
    derived() = default;
};

derived x;

So, is it a bug in g++ or VC++ 2013 just ignored something?

Here's the complete code...

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};

class derived : public base {
private:
    derived() = default;
};

derived x;

int main() { 
}

... and g++ error message.

main.cpp:12:5: error: 'constexpr derived::derived()' is private
     derived() = default;
     ^
main.cpp:15:9: error: within this context
 derived x;
         ^
main.cpp: In constructor 'constexpr derived::derived()':
main.cpp:3:5: error: 'constexpr base::base()' is private
     base() = default;
     ^
main.cpp:12:5: error: within this context
     derived() = default;
     ^
main.cpp: At global scope:
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here
 derived x;
         ^
like image 263
so61pi Avatar asked Apr 15 '14 16:04

so61pi


1 Answers

You are misreading the error, it is telling you that the default constructor for derived is not accessible (is private) so that you cannot use that to create an object of that type. Now making it public at the derived level won't help, since the base constructor is also private and thus cannot be used within the constructor of derived.

Why do you want those constructors to be private?

like image 152
David Rodríguez - dribeas Avatar answered Sep 29 '22 19:09

David Rodríguez - dribeas