#include <iostream>
using namespace std;
class A
{
protected:
int a;
};
class B : public A
{
public:
int func(A* p)
{
cout << p->a;
}
};
I really cannot understand why I cant access to 'a' by 'p->a'.
Is there anyway to access p's member 'a' in class B, without changing 'protected' to 'public'?
Single Inheritance Example When a class inherits another class, it is known as a single inheritance. In the example given below, Dog class inherits the Animal class, so there is the single inheritance.
Multiple Inheritance is a feature of an object-oriented concept, where a class can inherit properties of more than one parent class. The problem occurs when there exist methods with the same signature in both the superclasses and subclass.
No it doesn't. C is not an Object Oriented language. You can try C++ or Java for inheritance functionality.
Inheritance in C++ The capability of a class to derive properties and characteristics from another class is called Inheritance. Inheritance is one of the most important features of Object-Oriented Programming. Inheritance is a feature or a process in which, new classes are created from the existing classes.
On this topic, the C++03 standard states (emphasis mine):
11.5 Protected member access
1 When a friend or a member function of a derived class references a protected nonstatic member function or protected nonstatic data member of a base class, an access check applies in addition to those described earlier in clause 11. Except when forming a pointer to member (5.3.1), the access must be through a pointer to, reference to, or object of the derived class itself (or any class derived from that class) (5.2.5).
What you are doing here, however, is trying to access through a pointer to the base class, which is illegal. If you change the signature to
int func(B* p) // instead of A*
you will find that it now compiles normally.
This is also the reason why you can access a
without trouble from inside class B
: the access is made through the implicit pointer this
, which is of type B*
(the derived class again). If you tried this:
A* parent = static_cast<A*>(this);
int x = parent->a; // Does not compile!
You would find that it won't compile, for the very same reason.
The converse also applies: if you downcast the pointer p
to a B*
you can access the protected
member just fine:
class A
{
public:
// Added virtual destructor so that the class acquires a vptr,
// making dynamic_cast possible.
virtual ~A() {};
protected:
int a;
};
class B : public A
{
public:
int func(A* p)
{
// Now if we downcast p to B* we can access a just fine
// Of course if p does not actually point to a B, the
// program will have undefined behavior
int x = dynamic_cast<B*>(p)->a;
}
};
Using p->a
would only let you access public variables of A. Since a
is a protected variable, you should use cout << a
, since a
is inherited in class B.
I think you could use cout << p->a
by friend
ing class B.
Or by using a pointer to B
instead of a pointer to A
, as Jon noted.
Ahh, this is a good question. First, let me start off by saying B
is NOT a friend of A
, and therefore does not have access to A
's privates (or protected's) through an "A" view of the object. Even though we are in the scope of class B
, we cannot just go around looking at A
's privates (or protected's).
HOWEVER, B does have an a
. And it does have access to it, because it is declared a protected member of A
. But the only way to see int a
inside of a B
, is to get it from a B
view of an object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With