I want my class Foo to expose it's base class Bar only as a const reference to Bar. This would mean that the members of Bar could be read, but not set.
This is what I've tried:
struct Bar
{
int member;
};
class Foo : protected Bar
{
public:
operator const Bar&() { return *this; }
};
But when using this, following problem arises:
int getBarMember( const Bar& bar )
{
return bar.member;
}
int main()
{
Foo myFoo;
const Bar& refBar = myFoo; // C2243
// const Bar& refBar = (const Bar&) myFoo; // always need to cast explicitly
int read = refBar.member;
int readByFunction = getBarMember( myFoo ); // C2243
// int readByFunction = getBarMember( (const Bar&) myFoo ); // always need to cast explicitly
}
I want to be able to call functions that take const references to Bar without explicit casts.
The Compiler Error is:
C2243: 'conversion type' conversion from 'Foo *' to 'const Bar&' exists, but is inaccessible
I don't think it's possible, gcc and clang issue the following warning on the operator :
If it's possible in your real code, you could use composition over inheritance principle and do the following (see it online):
It will probably require some changes in the way you access
BarwithinFoo, but it will work without casts for the outside world.