Why doesn't a class having private constructor prevent inheriting from this class? How to control which classes can inherit from a certain base? The 2019 Stack Overflow Developer Survey Results Are InC++ zero initialization - Why is `b` in this program uninitialized, but `a` is initialized?Deleted default constructor. Objects can still be created… sometimesWhat is the default access of constructor in c++Extending a singleton class which has private constructor and destructor gives compile time warningHow to Restrict creation of objects from certain classCan a friend class invoke a private constructor in c++? (and what's Singleton)how can a base class disable the derived class's constructorCan you force classes inheriting from abstract base class to only have the public methods defined in base case?Inherit from class with private initializer?How to enforce private constructors in children of a base classConditional access to base class from inherited class in c++How to unit test a class with private constructor?Why does C++ forbid private inheritance of a final class?

Is bread bad for ducks?

"What time...?" or "At what time...?" - what is more grammatically correct?

Why can Shazam do this?

Unbreakable Formation vs. Cry of the Carnarium

Springs with some finite mass

Feasability of miniature nuclear reactors for humanoid cyborgs

Spanish for "widget"

Why is the maximum length of openwrt’s root password 8 characters?

How to answer pointed "are you quitting" questioning when I don't want them to suspect

Is three citations per paragraph excessive for undergraduate research paper?

How are circuits which use complex ICs normally simulated?

Is it possible to build an equivalent function just looking at the input and output of the original function?

How can I create a character who can assume the widest possible range of creature sizes?

Manuscript was "unsubmitted" because the manuscript was deposited in Arxiv Preprints

I looked up a future colleague on linkedin before I started a job. I told my colleague about it and he seemed surprised. Should I apologize?

How to manage monthly salary

What do hard-Brexiteers want with respect to the Irish border?

A poker game description that does not feel gimmicky

Why do UK politicians seemingly ignore opinion polls on Brexit?

Is "plugging out" electronic devices an American expression?

What tool would a Roman-age civilisation use to reduce/breakup silver and other metals?

Geography at the pixel level

Where to refill my bottle in India?

If Wish Duplicates Simulacrum, Are Existing Duplicates Destroyed?



Why doesn't a class having private constructor prevent inheriting from this class? How to control which classes can inherit from a certain base?



The 2019 Stack Overflow Developer Survey Results Are InC++ zero initialization - Why is `b` in this program uninitialized, but `a` is initialized?Deleted default constructor. Objects can still be created… sometimesWhat is the default access of constructor in c++Extending a singleton class which has private constructor and destructor gives compile time warningHow to Restrict creation of objects from certain classCan a friend class invoke a private constructor in c++? (and what's Singleton)how can a base class disable the derived class's constructorCan you force classes inheriting from abstract base class to only have the public methods defined in base case?Inherit from class with private initializer?How to enforce private constructors in children of a base classConditional access to base class from inherited class in c++How to unit test a class with private constructor?Why does C++ forbid private inheritance of a final class?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








24















class B 
private:
friend class C;
B() = default;
;

class C : public B ;
class D : public B ;

int main()
C ;
D ;
return 0;



I assumed that since only class C is a friend of B, and B's constructor is private, then only class C is valid and D is not allowed to instantiate B. But that's not how it works. Where am I wrong with my reasoning, and how to achieve this kind of control over which classes are allowed to subclass a certain base?



Update: as pointed out by others in the comments, the snippet above works as I initially expected under C++14, but not C++17. Changing the instantiation to C c; D d; in main() does work as expected in C++17 mode as well.










share|improve this question
























  • See this: stackoverflow.com/questions/32235294/…

    – Diodacus
    Apr 5 at 12:14











  • @Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

    – Violet Giraffe
    Apr 5 at 12:17






  • 2





    I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

    – vahancho
    Apr 5 at 12:17











  • how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

    – Stefan
    Apr 5 at 12:17






  • 1





    @Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

    – Violet Giraffe
    Apr 5 at 12:24


















24















class B 
private:
friend class C;
B() = default;
;

class C : public B ;
class D : public B ;

int main()
C ;
D ;
return 0;



I assumed that since only class C is a friend of B, and B's constructor is private, then only class C is valid and D is not allowed to instantiate B. But that's not how it works. Where am I wrong with my reasoning, and how to achieve this kind of control over which classes are allowed to subclass a certain base?



Update: as pointed out by others in the comments, the snippet above works as I initially expected under C++14, but not C++17. Changing the instantiation to C c; D d; in main() does work as expected in C++17 mode as well.










share|improve this question
























  • See this: stackoverflow.com/questions/32235294/…

    – Diodacus
    Apr 5 at 12:14











  • @Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

    – Violet Giraffe
    Apr 5 at 12:17






  • 2





    I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

    – vahancho
    Apr 5 at 12:17











  • how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

    – Stefan
    Apr 5 at 12:17






  • 1





    @Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

    – Violet Giraffe
    Apr 5 at 12:24














24












24








24


1






class B 
private:
friend class C;
B() = default;
;

class C : public B ;
class D : public B ;

int main()
C ;
D ;
return 0;



I assumed that since only class C is a friend of B, and B's constructor is private, then only class C is valid and D is not allowed to instantiate B. But that's not how it works. Where am I wrong with my reasoning, and how to achieve this kind of control over which classes are allowed to subclass a certain base?



Update: as pointed out by others in the comments, the snippet above works as I initially expected under C++14, but not C++17. Changing the instantiation to C c; D d; in main() does work as expected in C++17 mode as well.










share|improve this question
















class B 
private:
friend class C;
B() = default;
;

class C : public B ;
class D : public B ;

int main()
C ;
D ;
return 0;



I assumed that since only class C is a friend of B, and B's constructor is private, then only class C is valid and D is not allowed to instantiate B. But that's not how it works. Where am I wrong with my reasoning, and how to achieve this kind of control over which classes are allowed to subclass a certain base?



Update: as pointed out by others in the comments, the snippet above works as I initially expected under C++14, but not C++17. Changing the instantiation to C c; D d; in main() does work as expected in C++17 mode as well.







c++ c++11 inheritance c++17






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 5 at 12:29







Violet Giraffe

















asked Apr 5 at 12:12









Violet GiraffeViolet Giraffe

15.1k29139256




15.1k29139256












  • See this: stackoverflow.com/questions/32235294/…

    – Diodacus
    Apr 5 at 12:14











  • @Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

    – Violet Giraffe
    Apr 5 at 12:17






  • 2





    I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

    – vahancho
    Apr 5 at 12:17











  • how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

    – Stefan
    Apr 5 at 12:17






  • 1





    @Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

    – Violet Giraffe
    Apr 5 at 12:24


















  • See this: stackoverflow.com/questions/32235294/…

    – Diodacus
    Apr 5 at 12:14











  • @Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

    – Violet Giraffe
    Apr 5 at 12:17






  • 2





    I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

    – vahancho
    Apr 5 at 12:17











  • how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

    – Stefan
    Apr 5 at 12:17






  • 1





    @Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

    – Violet Giraffe
    Apr 5 at 12:24

















See this: stackoverflow.com/questions/32235294/…

– Diodacus
Apr 5 at 12:14





See this: stackoverflow.com/questions/32235294/…

– Diodacus
Apr 5 at 12:14













@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

– Violet Giraffe
Apr 5 at 12:17





@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the private: section?

– Violet Giraffe
Apr 5 at 12:17




2




2





I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

– vahancho
Apr 5 at 12:17





I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)

– vahancho
Apr 5 at 12:17













how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

– Stefan
Apr 5 at 12:17





how to achieve this kind of control over which classes are allowed to sublcass a certain base; I understand your wish, but can you explain why you would want this? Because it means that whenever you want to make an extra class, through inheritance, you need to alter the base class and this might be considered as anti-pattern

– Stefan
Apr 5 at 12:17




1




1





@Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

– Violet Giraffe
Apr 5 at 12:24






@Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclass B, and I'm trying to express/enforce this logical constraint in C++.

– Violet Giraffe
Apr 5 at 12:24













2 Answers
2






active

oldest

votes


















24














This is a new feature added to C++17. What is going on is C is now considered an aggregate. Since it is an aggregate, it doesn't need a constructor. If we look at [dcl.init.aggr]/1 we get that an aggregate is




An aggregate is an array or a class with



  • no user-provided, explicit, or inherited constructors ([class.ctor]),


  • no private or protected non-static data members (Clause [class.access]),


  • no virtual functions, and


  • no virtual, private, or protected base classes ([class.mi]).


[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]




And we check of all those bullet points. You don't have any constructors declared in C or D so there is bullet 1. You don't have any data members so the second bullet doesn't matter, and your base class is public so the third bullet is satisfied.



The change that happened between C++11/14 and C++17 that allows this is that aggregates can now have base classes. You can see the old wording here where it expressly stated that bases classes are not allowed.



We can confirm this by checking the trait std::is_aggregate_v like



int main()

std::cout << std::is_aggregate_v<C>;



which will print 1.




Do note that since C is a friend of B you can use



C c;
C c1;
C c2 = C();


As valid ways to initialize a C. Since D is not a friend of B the only one that works is D d; as that is aggregate initialization. All of the other forms try to default initialize and that can't be done since D has a deleted default constructor.






share|improve this answer




















  • 1





    I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

    – VTT
    Apr 5 at 12:44






  • 2





    @VTT That makes no difference. B() = default inside the class is still a user declared constructor.

    – NathanOliver
    Apr 5 at 12:45






  • 1





    @NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

    – Fureeish
    Apr 5 at 12:46






  • 1





    @Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

    – NathanOliver
    Apr 5 at 12:49






  • 2





    @VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

    – NathanOliver
    Apr 5 at 13:15


















-5














From What is the default access of constructor in c++:



If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted. An implicitly-declared default constructor is an inline public member of its class.



If the class definition does not explicitly declare a copy constructor, one is declared implicitly. [...] An implicitly-declared copy/move constructor is an inline public member of its class.



Constructors for classes C and D are generated internally by compiler.



BTW.: If you want to play with inheritance, please make sure you have virtual destructor defined.






share|improve this answer




















  • 1





    I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

    – Violet Giraffe
    Apr 5 at 12:19











  • does this answer the question?

    – sp2danny
    Apr 5 at 12:21











  • So why B() = default; is threated as "no user-declared constructor"?

    – VTT
    Apr 5 at 12:23











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55535107%2fwhy-doesnt-a-class-having-private-constructor-prevent-inheriting-from-this-clas%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









24














This is a new feature added to C++17. What is going on is C is now considered an aggregate. Since it is an aggregate, it doesn't need a constructor. If we look at [dcl.init.aggr]/1 we get that an aggregate is




An aggregate is an array or a class with



  • no user-provided, explicit, or inherited constructors ([class.ctor]),


  • no private or protected non-static data members (Clause [class.access]),


  • no virtual functions, and


  • no virtual, private, or protected base classes ([class.mi]).


[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]




And we check of all those bullet points. You don't have any constructors declared in C or D so there is bullet 1. You don't have any data members so the second bullet doesn't matter, and your base class is public so the third bullet is satisfied.



The change that happened between C++11/14 and C++17 that allows this is that aggregates can now have base classes. You can see the old wording here where it expressly stated that bases classes are not allowed.



We can confirm this by checking the trait std::is_aggregate_v like



int main()

std::cout << std::is_aggregate_v<C>;



which will print 1.




Do note that since C is a friend of B you can use



C c;
C c1;
C c2 = C();


As valid ways to initialize a C. Since D is not a friend of B the only one that works is D d; as that is aggregate initialization. All of the other forms try to default initialize and that can't be done since D has a deleted default constructor.






share|improve this answer




















  • 1





    I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

    – VTT
    Apr 5 at 12:44






  • 2





    @VTT That makes no difference. B() = default inside the class is still a user declared constructor.

    – NathanOliver
    Apr 5 at 12:45






  • 1





    @NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

    – Fureeish
    Apr 5 at 12:46






  • 1





    @Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

    – NathanOliver
    Apr 5 at 12:49






  • 2





    @VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

    – NathanOliver
    Apr 5 at 13:15















24














This is a new feature added to C++17. What is going on is C is now considered an aggregate. Since it is an aggregate, it doesn't need a constructor. If we look at [dcl.init.aggr]/1 we get that an aggregate is




An aggregate is an array or a class with



  • no user-provided, explicit, or inherited constructors ([class.ctor]),


  • no private or protected non-static data members (Clause [class.access]),


  • no virtual functions, and


  • no virtual, private, or protected base classes ([class.mi]).


[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]




And we check of all those bullet points. You don't have any constructors declared in C or D so there is bullet 1. You don't have any data members so the second bullet doesn't matter, and your base class is public so the third bullet is satisfied.



The change that happened between C++11/14 and C++17 that allows this is that aggregates can now have base classes. You can see the old wording here where it expressly stated that bases classes are not allowed.



We can confirm this by checking the trait std::is_aggregate_v like



int main()

std::cout << std::is_aggregate_v<C>;



which will print 1.




Do note that since C is a friend of B you can use



C c;
C c1;
C c2 = C();


As valid ways to initialize a C. Since D is not a friend of B the only one that works is D d; as that is aggregate initialization. All of the other forms try to default initialize and that can't be done since D has a deleted default constructor.






share|improve this answer




















  • 1





    I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

    – VTT
    Apr 5 at 12:44






  • 2





    @VTT That makes no difference. B() = default inside the class is still a user declared constructor.

    – NathanOliver
    Apr 5 at 12:45






  • 1





    @NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

    – Fureeish
    Apr 5 at 12:46






  • 1





    @Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

    – NathanOliver
    Apr 5 at 12:49






  • 2





    @VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

    – NathanOliver
    Apr 5 at 13:15













24












24








24







This is a new feature added to C++17. What is going on is C is now considered an aggregate. Since it is an aggregate, it doesn't need a constructor. If we look at [dcl.init.aggr]/1 we get that an aggregate is




An aggregate is an array or a class with



  • no user-provided, explicit, or inherited constructors ([class.ctor]),


  • no private or protected non-static data members (Clause [class.access]),


  • no virtual functions, and


  • no virtual, private, or protected base classes ([class.mi]).


[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]




And we check of all those bullet points. You don't have any constructors declared in C or D so there is bullet 1. You don't have any data members so the second bullet doesn't matter, and your base class is public so the third bullet is satisfied.



The change that happened between C++11/14 and C++17 that allows this is that aggregates can now have base classes. You can see the old wording here where it expressly stated that bases classes are not allowed.



We can confirm this by checking the trait std::is_aggregate_v like



int main()

std::cout << std::is_aggregate_v<C>;



which will print 1.




Do note that since C is a friend of B you can use



C c;
C c1;
C c2 = C();


As valid ways to initialize a C. Since D is not a friend of B the only one that works is D d; as that is aggregate initialization. All of the other forms try to default initialize and that can't be done since D has a deleted default constructor.






share|improve this answer















This is a new feature added to C++17. What is going on is C is now considered an aggregate. Since it is an aggregate, it doesn't need a constructor. If we look at [dcl.init.aggr]/1 we get that an aggregate is




An aggregate is an array or a class with



  • no user-provided, explicit, or inherited constructors ([class.ctor]),


  • no private or protected non-static data members (Clause [class.access]),


  • no virtual functions, and


  • no virtual, private, or protected base classes ([class.mi]).


[ Note: Aggregate initialization does not allow accessing protected and private base class' members or constructors.  — end note ]




And we check of all those bullet points. You don't have any constructors declared in C or D so there is bullet 1. You don't have any data members so the second bullet doesn't matter, and your base class is public so the third bullet is satisfied.



The change that happened between C++11/14 and C++17 that allows this is that aggregates can now have base classes. You can see the old wording here where it expressly stated that bases classes are not allowed.



We can confirm this by checking the trait std::is_aggregate_v like



int main()

std::cout << std::is_aggregate_v<C>;



which will print 1.




Do note that since C is a friend of B you can use



C c;
C c1;
C c2 = C();


As valid ways to initialize a C. Since D is not a friend of B the only one that works is D d; as that is aggregate initialization. All of the other forms try to default initialize and that can't be done since D has a deleted default constructor.







share|improve this answer














share|improve this answer



share|improve this answer








edited Apr 5 at 14:50

























answered Apr 5 at 12:40









NathanOliverNathanOliver

98.4k16138217




98.4k16138217







  • 1





    I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

    – VTT
    Apr 5 at 12:44






  • 2





    @VTT That makes no difference. B() = default inside the class is still a user declared constructor.

    – NathanOliver
    Apr 5 at 12:45






  • 1





    @NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

    – Fureeish
    Apr 5 at 12:46






  • 1





    @Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

    – NathanOliver
    Apr 5 at 12:49






  • 2





    @VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

    – NathanOliver
    Apr 5 at 13:15












  • 1





    I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

    – VTT
    Apr 5 at 12:44






  • 2





    @VTT That makes no difference. B() = default inside the class is still a user declared constructor.

    – NathanOliver
    Apr 5 at 12:45






  • 1





    @NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

    – Fureeish
    Apr 5 at 12:46






  • 1





    @Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

    – NathanOliver
    Apr 5 at 12:49






  • 2





    @VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

    – NathanOliver
    Apr 5 at 13:15







1




1





I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

– VTT
Apr 5 at 12:44





I guess writing defaulted constructor definition out of class like B::B() = default; will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?

– VTT
Apr 5 at 12:44




2




2





@VTT That makes no difference. B() = default inside the class is still a user declared constructor.

– NathanOliver
Apr 5 at 12:45





@VTT That makes no difference. B() = default inside the class is still a user declared constructor.

– NathanOliver
Apr 5 at 12:45




1




1





@NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

– Fureeish
Apr 5 at 12:46





@NathanOliver you sure? I'm quite certain that during one of the many talks in cppcon one of the lecturers explained the difference, although it may be applied elsewhere, not in this very example. Can't find the link tho.

– Fureeish
Apr 5 at 12:46




1




1





@Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

– NathanOliver
Apr 5 at 12:49





@Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…

– NathanOliver
Apr 5 at 12:49




2




2





@VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

– NathanOliver
Apr 5 at 13:15





@VioletGiraffe D d2(); is the most vexing parse so you have a function, not an object.

– NathanOliver
Apr 5 at 13:15













-5














From What is the default access of constructor in c++:



If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted. An implicitly-declared default constructor is an inline public member of its class.



If the class definition does not explicitly declare a copy constructor, one is declared implicitly. [...] An implicitly-declared copy/move constructor is an inline public member of its class.



Constructors for classes C and D are generated internally by compiler.



BTW.: If you want to play with inheritance, please make sure you have virtual destructor defined.






share|improve this answer




















  • 1





    I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

    – Violet Giraffe
    Apr 5 at 12:19











  • does this answer the question?

    – sp2danny
    Apr 5 at 12:21











  • So why B() = default; is threated as "no user-declared constructor"?

    – VTT
    Apr 5 at 12:23















-5














From What is the default access of constructor in c++:



If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted. An implicitly-declared default constructor is an inline public member of its class.



If the class definition does not explicitly declare a copy constructor, one is declared implicitly. [...] An implicitly-declared copy/move constructor is an inline public member of its class.



Constructors for classes C and D are generated internally by compiler.



BTW.: If you want to play with inheritance, please make sure you have virtual destructor defined.






share|improve this answer




















  • 1





    I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

    – Violet Giraffe
    Apr 5 at 12:19











  • does this answer the question?

    – sp2danny
    Apr 5 at 12:21











  • So why B() = default; is threated as "no user-declared constructor"?

    – VTT
    Apr 5 at 12:23













-5












-5








-5







From What is the default access of constructor in c++:



If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted. An implicitly-declared default constructor is an inline public member of its class.



If the class definition does not explicitly declare a copy constructor, one is declared implicitly. [...] An implicitly-declared copy/move constructor is an inline public member of its class.



Constructors for classes C and D are generated internally by compiler.



BTW.: If you want to play with inheritance, please make sure you have virtual destructor defined.






share|improve this answer















From What is the default access of constructor in c++:



If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted. An implicitly-declared default constructor is an inline public member of its class.



If the class definition does not explicitly declare a copy constructor, one is declared implicitly. [...] An implicitly-declared copy/move constructor is an inline public member of its class.



Constructors for classes C and D are generated internally by compiler.



BTW.: If you want to play with inheritance, please make sure you have virtual destructor defined.







share|improve this answer














share|improve this answer



share|improve this answer








edited Apr 5 at 12:27









TrebledJ

3,65421328




3,65421328










answered Apr 5 at 12:16









DiodacusDiodacus

2276




2276







  • 1





    I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

    – Violet Giraffe
    Apr 5 at 12:19











  • does this answer the question?

    – sp2danny
    Apr 5 at 12:21











  • So why B() = default; is threated as "no user-declared constructor"?

    – VTT
    Apr 5 at 12:23












  • 1





    I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

    – Violet Giraffe
    Apr 5 at 12:19











  • does this answer the question?

    – sp2danny
    Apr 5 at 12:21











  • So why B() = default; is threated as "no user-declared constructor"?

    – VTT
    Apr 5 at 12:23







1




1





I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

– Violet Giraffe
Apr 5 at 12:19





I think you misunderstood the point of my confusion, although your link is still relevant. I know each C and D has a default public constructor, but D is not supposed to be able to instantiate the instance of its base class B because of the latter's constructor being private.

– Violet Giraffe
Apr 5 at 12:19













does this answer the question?

– sp2danny
Apr 5 at 12:21





does this answer the question?

– sp2danny
Apr 5 at 12:21













So why B() = default; is threated as "no user-declared constructor"?

– VTT
Apr 5 at 12:23





So why B() = default; is threated as "no user-declared constructor"?

– VTT
Apr 5 at 12:23

















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55535107%2fwhy-doesnt-a-class-having-private-constructor-prevent-inheriting-from-this-clas%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to write a 12-bar blues melodyI-IV-V blues progressionHow to play the bridges in a standard blues progressionHow does Gdim7 fit in C# minor?question on a certain chord progressionMusicology of Melody12 bar blues, spread rhythm: alternative to 6th chord to avoid finger stretchChord progressions/ Root key/ MelodiesHow to put chords (POP-EDM) under a given lead vocal melody (starting from a good knowledge in music theory)Are there “rules” for improvising with the minor pentatonic scale over 12-bar shuffle?Confusion about blues scale and chords

What if the end-user didn't have the required library?What is setup.py?What is a clean, pythonic way to have multiple constructors in Python?What does Ruby have that Python doesn't, and vice versa?What is the reason for having '//' in Python?How do I create a namespace package in Python?How to package shared objects that python modules depend on?setuptools vs. distutils: why is distutils still a thing?Navigation in Windows 10 vs code not going to virtualenv library when the same library is installed at user levelPython create package for local usePackaging a project that uses multiple python versionsWhy is permission denied on pip install except for when “--user” is included at end of command?

Why did Thanos need his ship to help him in the battle scene?Which actor plays Thanos in the Avengers mid-credits scene?Are there economic implications portrayed in comics where the buildings and cities are ruined almost daily?Old X-Men comic where team travels to alien world with a ring-like sun that needs recharging?Why does Ego need help sleeping?Is there an objective answer to who “the strongest Avenger” is?How did Banner get unstuck?Why did Thanos get hit?How did Thanos (or anyone) know the Infinity Stones would give him this power?Did Thanos leave Eitri alive for his after-sales service?In Avengers 1, why does Thanos need Loki?