Idiomatic way to prevent slicing? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceForce function to be called only with specific typesWhat is object slicing?How to initialize a const field in constructor?What's the point of g++ -Wreorder?Java: Can Vector<derived> be called as Vector<base>?Easiest way to convert int to string in C++capture variables inside of subclass?Detecting if a type can be derived from in C++Implementing polymorphic operator==() in C++ idiomatic wayIs using inline classes inside a function permitted to be used as template types?Short-circuit evaluation and assignment in C++
Relations between two reciprocal partial derivatives?
Did the new image of black hole confirm the general theory of relativity?
Didn't get enough time to take a Coding Test - what to do now?
Can the prologue be the backstory of your main character?
I could not break this equation. Please help me
The variadic template constructor of my class cannot modify my class members, why is that so?
What do you call a plan that's an alternative plan in case your initial plan fails?
Do working physicists consider Newtonian mechanics to be "falsified"?
system call string length limit
Can smartphones with the same camera sensor have different image quality?
Difference between "generating set" and free product?
Simulating Exploding Dice
Is a pteranodon too powerful as a beast companion for a beast master?
Does the AirPods case need to be around while listening via an iOS Device?
He got a vote 80% that of Emmanuel Macron’s
Finding degree of a finite field extension
Why can't wing-mounted spoilers be used to steepen approaches?
Segmentation fault output is suppressed when piping stdin into a function. Why?
Keeping a retro style to sci-fi spaceships?
Can a 1st-level character have an ability score above 18?
Did the UK government pay "millions and millions of dollars" to try to snag Julian Assange?
Am I ethically obligated to go into work on an off day if the reason is sudden?
Is every episode of "Where are my Pants?" identical?
Windows 10: How to Lock (not sleep) laptop on lid close?
Idiomatic way to prevent slicing?
The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceForce function to be called only with specific typesWhat is object slicing?How to initialize a const field in constructor?What's the point of g++ -Wreorder?Java: Can Vector<derived> be called as Vector<base>?Easiest way to convert int to string in C++capture variables inside of subclass?Detecting if a type can be derived from in C++Implementing polymorphic operator==() in C++ idiomatic wayIs using inline classes inside a function permitted to be used as template types?Short-circuit evaluation and assignment in C++
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Sometimes it can be an annoyance that c++ defaults to allow slicing. For example
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!
This compiles and runs as expected! Though, what if I dont want to enable slicing?
What is the idiomatic way to write foo such that one cannot slice instances of any derived class?
c++ inheritance object-slicing
add a comment |
Sometimes it can be an annoyance that c++ defaults to allow slicing. For example
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!
This compiles and runs as expected! Though, what if I dont want to enable slicing?
What is the idiomatic way to write foo such that one cannot slice instances of any derived class?
c++ inheritance object-slicing
The easiest way is to not use inheritance. You have havefoobe a member variable ofbar.
– KevinZ
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday
add a comment |
Sometimes it can be an annoyance that c++ defaults to allow slicing. For example
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!
This compiles and runs as expected! Though, what if I dont want to enable slicing?
What is the idiomatic way to write foo such that one cannot slice instances of any derived class?
c++ inheritance object-slicing
Sometimes it can be an annoyance that c++ defaults to allow slicing. For example
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!
This compiles and runs as expected! Though, what if I dont want to enable slicing?
What is the idiomatic way to write foo such that one cannot slice instances of any derived class?
c++ inheritance object-slicing
c++ inheritance object-slicing
edited yesterday
user463035818
asked Apr 9 at 19:32
user463035818user463035818
19.1k42971
19.1k42971
The easiest way is to not use inheritance. You have havefoobe a member variable ofbar.
– KevinZ
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday
add a comment |
The easiest way is to not use inheritance. You have havefoobe a member variable ofbar.
– KevinZ
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday
The easiest way is to not use inheritance. You have have
foo be a member variable of bar.– KevinZ
yesterday
The easiest way is to not use inheritance. You have have
foo be a member variable of bar.– KevinZ
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday
add a comment |
3 Answers
3
active
oldest
votes
I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to
struct foo
int a;
foo() = default; // you have to add this because of the template constructor
template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo
template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;
then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.
Note that this doesn't prevent explicit slicing like this:foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.
– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
|
show 1 more comment
Since 2011, the idiomatic way has been to use auto:
#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
auto y = x; // <- y is a bar
If you wish to actively prevent slicing, there are a number of ways:
Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:
#include <iostream>
struct foo int a; ;
struct bar
bar(int a, int b)
: foo_(a)
, b(b)
int b;
int get_a() const return foo_.a;
private:
foo foo_;
;
int main()
bar x1,2;
// foo y = x; // <- does not compile
Another more specialised way might be to alter the permissions around copy operators:
#include <iostream>
struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;
;
struct bar : foo
bar(int a, int b)
: fooa, bb
int b;
;
int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile
add a comment |
You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:
struct foo
// ...
protected:
foo(foo&) = default;
;
6
but then I cannot copyfoos anymore :( I'd like to prevent only copying a bar to a foo if possible
– user463035818
Apr 9 at 19:42
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%2f55600025%2fidiomatic-way-to-prevent-slicing%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to
struct foo
int a;
foo() = default; // you have to add this because of the template constructor
template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo
template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;
then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.
Note that this doesn't prevent explicit slicing like this:foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.
– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
|
show 1 more comment
I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to
struct foo
int a;
foo() = default; // you have to add this because of the template constructor
template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo
template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;
then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.
Note that this doesn't prevent explicit slicing like this:foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.
– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
|
show 1 more comment
I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to
struct foo
int a;
foo() = default; // you have to add this because of the template constructor
template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo
template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;
then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.
I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to
struct foo
int a;
foo() = default; // you have to add this because of the template constructor
template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo
template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;
then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.
edited Apr 9 at 19:56
answered Apr 9 at 19:43
NathanOliverNathanOliver
98.7k16138218
98.7k16138218
Note that this doesn't prevent explicit slicing like this:foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.
– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
|
show 1 more comment
Note that this doesn't prevent explicit slicing like this:foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.
– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
Note that this doesn't prevent explicit slicing like this:
foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.– eerorika
Apr 9 at 20:02
Note that this doesn't prevent explicit slicing like this:
foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.– eerorika
Apr 9 at 20:02
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general
– user463035818
Apr 9 at 20:05
1
1
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
@user463035818 Yep. I've been using it since I've asked that Q.
– NathanOliver
Apr 9 at 20:06
4
4
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.
– NathanOliver
Apr 9 at 20:08
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)
– user463035818
Apr 10 at 8:23
|
show 1 more comment
Since 2011, the idiomatic way has been to use auto:
#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
auto y = x; // <- y is a bar
If you wish to actively prevent slicing, there are a number of ways:
Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:
#include <iostream>
struct foo int a; ;
struct bar
bar(int a, int b)
: foo_(a)
, b(b)
int b;
int get_a() const return foo_.a;
private:
foo foo_;
;
int main()
bar x1,2;
// foo y = x; // <- does not compile
Another more specialised way might be to alter the permissions around copy operators:
#include <iostream>
struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;
;
struct bar : foo
bar(int a, int b)
: fooa, bb
int b;
;
int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile
add a comment |
Since 2011, the idiomatic way has been to use auto:
#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
auto y = x; // <- y is a bar
If you wish to actively prevent slicing, there are a number of ways:
Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:
#include <iostream>
struct foo int a; ;
struct bar
bar(int a, int b)
: foo_(a)
, b(b)
int b;
int get_a() const return foo_.a;
private:
foo foo_;
;
int main()
bar x1,2;
// foo y = x; // <- does not compile
Another more specialised way might be to alter the permissions around copy operators:
#include <iostream>
struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;
;
struct bar : foo
bar(int a, int b)
: fooa, bb
int b;
;
int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile
add a comment |
Since 2011, the idiomatic way has been to use auto:
#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
auto y = x; // <- y is a bar
If you wish to actively prevent slicing, there are a number of ways:
Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:
#include <iostream>
struct foo int a; ;
struct bar
bar(int a, int b)
: foo_(a)
, b(b)
int b;
int get_a() const return foo_.a;
private:
foo foo_;
;
int main()
bar x1,2;
// foo y = x; // <- does not compile
Another more specialised way might be to alter the permissions around copy operators:
#include <iostream>
struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;
;
struct bar : foo
bar(int a, int b)
: fooa, bb
int b;
;
int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile
Since 2011, the idiomatic way has been to use auto:
#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;
int main()
bar x1,2;
auto y = x; // <- y is a bar
If you wish to actively prevent slicing, there are a number of ways:
Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:
#include <iostream>
struct foo int a; ;
struct bar
bar(int a, int b)
: foo_(a)
, b(b)
int b;
int get_a() const return foo_.a;
private:
foo foo_;
;
int main()
bar x1,2;
// foo y = x; // <- does not compile
Another more specialised way might be to alter the permissions around copy operators:
#include <iostream>
struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;
;
struct bar : foo
bar(int a, int b)
: fooa, bb
int b;
;
int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile
answered Apr 9 at 19:43
Richard HodgesRichard Hodges
57.1k658105
57.1k658105
add a comment |
add a comment |
You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:
struct foo
// ...
protected:
foo(foo&) = default;
;
6
but then I cannot copyfoos anymore :( I'd like to prevent only copying a bar to a foo if possible
– user463035818
Apr 9 at 19:42
add a comment |
You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:
struct foo
// ...
protected:
foo(foo&) = default;
;
6
but then I cannot copyfoos anymore :( I'd like to prevent only copying a bar to a foo if possible
– user463035818
Apr 9 at 19:42
add a comment |
You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:
struct foo
// ...
protected:
foo(foo&) = default;
;
You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:
struct foo
// ...
protected:
foo(foo&) = default;
;
answered Apr 9 at 19:41
eerorikaeerorika
90.1k664136
90.1k664136
6
but then I cannot copyfoos anymore :( I'd like to prevent only copying a bar to a foo if possible
– user463035818
Apr 9 at 19:42
add a comment |
6
but then I cannot copyfoos anymore :( I'd like to prevent only copying a bar to a foo if possible
– user463035818
Apr 9 at 19:42
6
6
but then I cannot copy
foos anymore :( I'd like to prevent only copying a bar to a foo if possible– user463035818
Apr 9 at 19:42
but then I cannot copy
foos anymore :( I'd like to prevent only copying a bar to a foo if possible– user463035818
Apr 9 at 19:42
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%2f55600025%2fidiomatic-way-to-prevent-slicing%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
The easiest way is to not use inheritance. You have have
foobe a member variable ofbar.– KevinZ
yesterday
@KevinZ stackoverflow.com/a/55600208/4117728
– user463035818
yesterday