Why doesn't a class having private constructor prevent inheriting from this class? How to control which classes can inherit from a certain base?C++ 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?
Why don't electron-positron collisions release infinite energy?
How can bays and straits be determined in a procedurally generated map?
What is the offset in a seaplane's hull?
What would happen to a modern skyscraper if it rains micro blackholes?
Can I ask the recruiters in my resume to put the reason why I am rejected?
What's the output of a record cartridge playing an out-of-speed record
Email Account under attack (really) - anything I can do?
The use of multiple foreign keys on same column in SQL Server
How does strength of boric acid solution increase in presence of salicylic acid?
Test whether all array elements are factors of a number
Is it possible to do 50 km distance without any previous training?
How did the USSR manage to innovate in an environment characterized by government censorship and high bureaucracy?
Theorems that impeded progress
A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?
What do you call a Matrix-like slowdown and camera movement effect?
Why Is Death Allowed In the Matrix?
Has the BBC provided arguments for saying Brexit being cancelled is unlikely?
What are these boxed doors outside store fronts in New York?
Font hinting is lost in Chrome-like browsers (for some languages )
Can an x86 CPU running in real mode be considered to be basically an 8086 CPU?
LaTeX closing $ signs makes cursor jump
Why not use SQL instead of GraphQL?
What typically incentivizes a professor to change jobs to a lower ranking university?
How to find program name(s) of an installed package?
Why doesn't a class having private constructor prevent inheriting from this class? How to control which classes can inherit from a certain base?
C++ 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;
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
|
show 16 more comments
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
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in theprivate:
section?
– Violet Giraffe
yesterday
2
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
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
yesterday
1
@Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclassB
, and I'm trying to express/enforce this logical constraint in C++.
– Violet Giraffe
yesterday
|
show 16 more comments
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
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
c++ c++11 inheritance c++17
edited yesterday
Violet Giraffe
asked yesterday
Violet GiraffeViolet Giraffe
15k29139256
15k29139256
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in theprivate:
section?
– Violet Giraffe
yesterday
2
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
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
yesterday
1
@Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclassB
, and I'm trying to express/enforce this logical constraint in C++.
– Violet Giraffe
yesterday
|
show 16 more comments
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in theprivate:
section?
– Violet Giraffe
yesterday
2
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
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
yesterday
1
@Stefan: I hear you, but there are exactly two classes for which it is semantically meaningful to subclassB
, and I'm trying to express/enforce this logical constraint in C++.
– Violet Giraffe
yesterday
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the
private:
section?– Violet Giraffe
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the
private:
section?– Violet Giraffe
yesterday
2
2
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
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
yesterday
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
yesterday
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
yesterday
@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
yesterday
|
show 16 more comments
2 Answers
2
active
oldest
votes
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.
1
I guess writing defaulted constructor definition out of class likeB::B() = default;
will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?
– VTT
yesterday
2
@VTT That makes no difference.B() = default
inside the class is still a user declared constructor.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
@VioletGiraffeD d2();
is the most vexing parse so you have a function, not an object.
– NathanOliver
yesterday
|
show 14 more comments
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.
1
I think you misunderstood the point of my confusion, although your link is still relevant. I know eachC
andD
has a default public constructor, butD
is not supposed to be able to instantiate the instance of its base classB
because of the latter's constructor being private.
– Violet Giraffe
yesterday
does this answer the question?
– sp2danny
yesterday
So whyB() = default;
is threated as "no user-declared constructor"?
– VTT
yesterday
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
1
I guess writing defaulted constructor definition out of class likeB::B() = default;
will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?
– VTT
yesterday
2
@VTT That makes no difference.B() = default
inside the class is still a user declared constructor.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
@VioletGiraffeD d2();
is the most vexing parse so you have a function, not an object.
– NathanOliver
yesterday
|
show 14 more comments
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.
1
I guess writing defaulted constructor definition out of class likeB::B() = default;
will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?
– VTT
yesterday
2
@VTT That makes no difference.B() = default
inside the class is still a user declared constructor.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
@VioletGiraffeD d2();
is the most vexing parse so you have a function, not an object.
– NathanOliver
yesterday
|
show 14 more comments
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.
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.
edited yesterday
answered yesterday
NathanOliverNathanOliver
98.2k16138217
98.2k16138217
1
I guess writing defaulted constructor definition out of class likeB::B() = default;
will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?
– VTT
yesterday
2
@VTT That makes no difference.B() = default
inside the class is still a user declared constructor.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
@VioletGiraffeD d2();
is the most vexing parse so you have a function, not an object.
– NathanOliver
yesterday
|
show 14 more comments
1
I guess writing defaulted constructor definition out of class likeB::B() = default;
will be considered a user-provided constructor, while defaulting it in class is considered a not-user-provided constructor?
– VTT
yesterday
2
@VTT That makes no difference.B() = default
inside the class is still a user declared constructor.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
@VioletGiraffeD d2();
is the most vexing parse so you have a function, not an object.
– NathanOliver
yesterday
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
yesterday
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
yesterday
2
2
@VTT That makes no difference.
B() = default
inside the class is still a user declared constructor.– NathanOliver
yesterday
@VTT That makes no difference.
B() = default
inside the class is still a user declared constructor.– NathanOliver
yesterday
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
yesterday
@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
yesterday
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
yesterday
@Fureeish 100% sure. What moving the constructor out of the class does change is how the object is initialized: stackoverflow.com/questions/54350114/…
– NathanOliver
yesterday
2
2
@VioletGiraffe
D d2();
is the most vexing parse so you have a function, not an object.– NathanOliver
yesterday
@VioletGiraffe
D d2();
is the most vexing parse so you have a function, not an object.– NathanOliver
yesterday
|
show 14 more comments
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.
1
I think you misunderstood the point of my confusion, although your link is still relevant. I know eachC
andD
has a default public constructor, butD
is not supposed to be able to instantiate the instance of its base classB
because of the latter's constructor being private.
– Violet Giraffe
yesterday
does this answer the question?
– sp2danny
yesterday
So whyB() = default;
is threated as "no user-declared constructor"?
– VTT
yesterday
add a comment |
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.
1
I think you misunderstood the point of my confusion, although your link is still relevant. I know eachC
andD
has a default public constructor, butD
is not supposed to be able to instantiate the instance of its base classB
because of the latter's constructor being private.
– Violet Giraffe
yesterday
does this answer the question?
– sp2danny
yesterday
So whyB() = default;
is threated as "no user-declared constructor"?
– VTT
yesterday
add a comment |
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.
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.
edited yesterday
TrebledJ
3,62021328
3,62021328
answered yesterday
DiodacusDiodacus
1946
1946
1
I think you misunderstood the point of my confusion, although your link is still relevant. I know eachC
andD
has a default public constructor, butD
is not supposed to be able to instantiate the instance of its base classB
because of the latter's constructor being private.
– Violet Giraffe
yesterday
does this answer the question?
– sp2danny
yesterday
So whyB() = default;
is threated as "no user-declared constructor"?
– VTT
yesterday
add a comment |
1
I think you misunderstood the point of my confusion, although your link is still relevant. I know eachC
andD
has a default public constructor, butD
is not supposed to be able to instantiate the instance of its base classB
because of the latter's constructor being private.
– Violet Giraffe
yesterday
does this answer the question?
– sp2danny
yesterday
So whyB() = default;
is threated as "no user-declared constructor"?
– VTT
yesterday
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
yesterday
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
yesterday
does this answer the question?
– sp2danny
yesterday
does this answer the question?
– sp2danny
yesterday
So why
B() = default;
is threated as "no user-declared constructor"?– VTT
yesterday
So why
B() = default;
is threated as "no user-declared constructor"?– VTT
yesterday
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
See this: stackoverflow.com/questions/32235294/…
– Diodacus
yesterday
@Diodacus: so what, declaring a private constructor as default makes it public, despite being declared in the
private:
section?– Violet Giraffe
yesterday
2
I got the error you expect: "'D::D(void)': attempting to reference a deleted function" (msvs 2017)
– vahancho
yesterday
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
yesterday
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
yesterday