derived class can not access base class protected member? | |
Hello everyone,
I met with a strange issue that derived class function can not access base
class's protected member. Do you know why?
Here is the error message and code. -
error C2248: 'base::~base' : cannot access protected member declared in
-
class 'base'
-
-
class base
-
{
-
protected:
-
~base() {}
-
private:
-
void foo()
-
{
-
base* b = new base;
-
delete b;
-
}
-
};
-
-
class derived : public base
-
{
-
public:
-
~derived() {}
-
private:
-
void goo()
-
{
-
base* b = new derived;
-
delete b; // error in this line
-
}
-
};
-
thanks in advance,
George | | | | re: derived class can not access base class protected member?
>I met with a strange issue that derived class function can not access base Quote:
>class's protected member. Do you know why?
George,
The code you have isn't using b as a base class, it's just the same as
though the classes were unrelated.
If you add:
friend class derived;
to class base, it will then compile, but whether that's what you
really want is another question.
Dave | | | | re: derived class can not access base class protected member?
Hi Dave,
What do you mean Quote:
The code you have isn't using b as a base class, it's just the same as
though the classes were unrelated.
I think I use the code
base* b = new derived;
delete b; // error in this line
in function goo, which is in derived class right?
regards,
George
"David Lowndes" wrote: Quote: Quote:
I met with a strange issue that derived class function can not access base
class's protected member. Do you know why?
>
George,
>
The code you have isn't using b as a base class, it's just the same as
though the classes were unrelated.
>
If you add:
>
friend class derived;
>
to class base, it will then compile, but whether that's what you
really want is another question.
>
Dave
>
| | | | re: derived class can not access base class protected member?
>I think I use the code Quote:
>
>base* b = new derived;
>delete b; // error in this line
>
>in function goo, which is in derived class right?
The class is a derived class, but your usage isn't.
I'm not sure what you're really trying to do, but since "derived" is
derived from "base" it already is a base class, there's no need to
create one.
Dave | | | | re: derived class can not access base class protected member?
Hi Dave,
What I want to do is,
1. in derived class member function goo, create a new instance of base class
object;
2. call protected method of the base class object instance.
But I do not know why there is access violation error in step 2, since I
think we can access protected member from derived class, right?
regards,
George
"David Lowndes" wrote: Quote: Quote:
I think I use the code
base* b = new derived;
delete b; // error in this line
in function goo, which is in derived class right?
>
The class is a derived class, but your usage isn't.
>
I'm not sure what you're really trying to do, but since "derived" is
derived from "base" it already is a base class, there's no need to
create one.
>
Dave
>
| | | | re: derived class can not access base class protected member?
>1. in derived class member function goo, create a new instance of base class Quote:
>object;
>
>2. call protected method of the base class object instance.
>
>But I do not know why there is access violation error in step 2, since I
>think we can access protected member from derived class, right?
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class. I think you need to use "friend" to do
that.
Dave | | | | re: derived class can not access base class protected member?
So, Dave, as you mentioned below, Quote:
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class.
I think we can understand that C++ access module is based on instance level,
not class level. Right?
regards,
George
"David Lowndes" wrote: Quote: Quote:
1. in derived class member function goo, create a new instance of base class
object;
2. call protected method of the base class object instance.
But I do not know why there is access violation error in step 2, since I
think we can access protected member from derived class, right?
>
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class. I think you need to use "friend" to do
that.
>
Dave
>
| | | | re: derived class can not access base class protected member?
So, Dave, as you mentioned below, Quote:
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class.
I think we can understand that C++ access module is based on instance level,
not class level. Right?
regards,
George
"David Lowndes" wrote: Quote: Quote:
1. in derived class member function goo, create a new instance of base class
object;
2. call protected method of the base class object instance.
But I do not know why there is access violation error in step 2, since I
think we can access protected member from derived class, right?
>
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class. I think you need to use "friend" to do
that.
>
Dave
>
| | | | re: derived class can not access base class protected member?
>A derived class can access *its* base class protected members, but Quote: Quote:
>clearly from the error you're getting, it can't do it for an arbitrary
>instance of the base class.
>
>I think we can understand that C++ access module is based on instance level,
>not class level. Right?
I'm not sure what you'd call it (I'm not a language expert, I just use
it).
Dave | | | | re: derived class can not access base class protected member?
Cool, Dave. I appreciate all of your help on this topic.
regards,
George
"David Lowndes" wrote: Quote: Quote: Quote:
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class.
I think we can understand that C++ access module is based on instance level,
not class level. Right?
>
I'm not sure what you'd call it (I'm not a language expert, I just use
it).
>
Dave
>
| | | | re: derived class can not access base class protected member?
"George" <George@discussions.microsoft.comwrote in message
news:3A2015D0-666D-412D-997E-718C6CC21E41@microsoft.com... Quote:
So, Dave, as you mentioned below,
> Quote:
>A derived class can access *its* base class protected members, but
>clearly from the error you're getting, it can't do it for an arbitrary
>instance of the base class.
>
I think we can understand that C++ access module is based on instance
level,
not class level. Right?
Based on the compile-time type of the instance. It doesn't matter that the
object really is a "derived" -- if it's being accessed through a base
pointer, you get the same kind of access as to other objects subtyped from
base. Quote:
>
>
regards,
George
>
"David Lowndes" wrote:
> Quote: Quote:
>1. in derived class member function goo, create a new instance of base
>class
>object;
>
>2. call protected method of the base class object instance.
>
>But I do not know why there is access violation error in step 2, since I
>think we can access protected member from derived class, right?
>>
>A derived class can access *its* base class protected members, but
>clearly from the error you're getting, it can't do it for an arbitrary
>instance of the base class. I think you need to use "friend" to do
>that.
>>
>Dave
>>
| | | | re: derived class can not access base class protected member?
Hi Ben,
I found my previous conclusion that then entry point of an instance must be
public and C++ provides instance level (not class level) access model is not
correct. I have developed the following sample,
in my sample, calling private member instance2.goo2() is correct in Visual
Studio 2005, even if instance2 is not *this*. So I do not think C++ provides
instance level access model. But from my original question, it seems that the
access model is instance level -- derived class can not access protected
member of base class.
So, what is the access model? Any comments?
class base
{
protected:
~base() {}
private:
void foo()
{
base* b = new base;
delete b;
}
};
class derived : public base
{
public:
~derived() {}
private:
void goo (derived& instance2) //derived class object
{
instance2.goo2();
}
void goo2()
{
}
};
regards,
George
"Ben Voigt [C++ MVP]" wrote: Quote:
>
"George" <George@discussions.microsoft.comwrote in message
news:3A2015D0-666D-412D-997E-718C6CC21E41@microsoft.com... Quote:
So, Dave, as you mentioned below, Quote:
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class.
I think we can understand that C++ access module is based on instance
level,
not class level. Right?
>
Based on the compile-time type of the instance. It doesn't matter that the
object really is a "derived" -- if it's being accessed through a base
pointer, you get the same kind of access as to other objects subtyped from
base.
> Quote:
regards,
George
"David Lowndes" wrote: Quote:
1. in derived class member function goo, create a new instance of base
class
object;
2. call protected method of the base class object instance.
But I do not know why there is access violation error in step 2, since I
think we can access protected member from derived class, right?
>
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class. I think you need to use "friend" to do
that.
>
Dave
>
>
>
>
| | | | re: derived class can not access base class protected member?
"George" <George@discussions.microsoft.comwrote in message
news:52F6EA86-CC84-4114-A454-DE3AE58A538E@microsoft.com... Quote:
Hi Ben,
>
>
I found my previous conclusion that then entry point of an instance must
be
public and C++ provides instance level (not class level) access model is
not
correct. I have developed the following sample,
>
in my sample, calling private member instance2.goo2() is correct in Visual
Studio 2005, even if instance2 is not *this*. So I do not think C++
provides
instance level access model. But from my original question, it seems that
the
access model is instance level -- derived class can not access protected
member of base class.
>
So, what is the access model? Any comments?
As I explained, it is based on the compile-time type. Members and friends
of class derived can access private and protected members of derived through
any derived* (this includes references, local variables, etc, as long as the
compiler can get a "this" pointer of type derived* using the normal casting
rules). I'm ignoring const for this discussion. Quote:
>
class base
{
protected:
~base() {}
private:
void foo()
{
base* b = new base;
delete b;
}
};
>
class derived : public base
{
public:
~derived() {}
private:
void goo (derived& instance2) //derived class object
{
>
instance2.goo2();
}
>
void goo2()
{
}
};
>
>
regards,
George
>
"Ben Voigt [C++ MVP]" wrote:
> Quote:
>>
>"George" <George@discussions.microsoft.comwrote in message
>news:3A2015D0-666D-412D-997E-718C6CC21E41@microsoft.com... Quote:
So, Dave, as you mentioned below,
>
>A derived class can access *its* base class protected members, but
>clearly from the error you're getting, it can't do it for an arbitrary
>instance of the base class.
>
I think we can understand that C++ access module is based on instance
level,
not class level. Right?
>>
>Based on the compile-time type of the instance. It doesn't matter that
>the
>object really is a "derived" -- if it's being accessed through a base
>pointer, you get the same kind of access as to other objects subtyped
>from
>base.
>> Quote:
>
>
regards,
George
>
"David Lowndes" wrote:
>
>1. in derived class member function goo, create a new instance of
>base
>class
>object;
>
>2. call protected method of the base class object instance.
>
>But I do not know why there is access violation error in step 2,
>since I
>think we can access protected member from derived class, right?
>>
>A derived class can access *its* base class protected members, but
>clearly from the error you're getting, it can't do it for an arbitrary
>instance of the base class. I think you need to use "friend" to do
>that.
>>
>Dave
>>
>>
>>
>>
| | | | re: derived class can not access base class protected member?
Thanks Ben,
I am clear now.
regards,
George
"Ben Voigt [C++ MVP]" wrote: Quote:
>
"George" <George@discussions.microsoft.comwrote in message
news:52F6EA86-CC84-4114-A454-DE3AE58A538E@microsoft.com... Quote:
Hi Ben,
I found my previous conclusion that then entry point of an instance must
be
public and C++ provides instance level (not class level) access model is
not
correct. I have developed the following sample,
in my sample, calling private member instance2.goo2() is correct in Visual
Studio 2005, even if instance2 is not *this*. So I do not think C++
provides
instance level access model. But from my original question, it seems that
the
access model is instance level -- derived class can not access protected
member of base class.
So, what is the access model? Any comments?
>
As I explained, it is based on the compile-time type. Members and friends
of class derived can access private and protected members of derived through
any derived* (this includes references, local variables, etc, as long as the
compiler can get a "this" pointer of type derived* using the normal casting
rules). I'm ignoring const for this discussion.
> Quote:
class base
{
protected:
~base() {}
private:
void foo()
{
base* b = new base;
delete b;
}
};
class derived : public base
{
public:
~derived() {}
private:
void goo (derived& instance2) //derived class object
{
instance2.goo2();
}
void goo2()
{
}
};
regards,
George
"Ben Voigt [C++ MVP]" wrote: Quote:
>
"George" <George@discussions.microsoft.comwrote in message
news:3A2015D0-666D-412D-997E-718C6CC21E41@microsoft.com...
So, Dave, as you mentioned below,
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class.
I think we can understand that C++ access module is based on instance
level,
not class level. Right?
>
Based on the compile-time type of the instance. It doesn't matter that
the
object really is a "derived" -- if it's being accessed through a base
pointer, you get the same kind of access as to other objects subtyped
from
base.
>
regards,
George
"David Lowndes" wrote:
1. in derived class member function goo, create a new instance of
base
class
object;
2. call protected method of the base class object instance.
But I do not know why there is access violation error in step 2,
since I
think we can access protected member from derived class, right?
>
A derived class can access *its* base class protected members, but
clearly from the error you're getting, it can't do it for an arbitrary
instance of the base class. I think you need to use "friend" to do
that.
>
Dave
>
>
>
>
>
>
>
| | | | re: derived class can not access base class protected member?
private: Because foo( ) is defined as PRIVATE (not protected) in the base class
(typo?)... ;)
[==Peter==]
"George" <George@discussions.microsoft.comwrote in message
news:D783AA73-AC91-45C2-B534-112BEFEC3BAA@microsoft.com... Quote:
Hello everyone,
>
>
I met with a strange issue that derived class function can not access base
class's protected member. Do you know why?
>
Here is the error message and code.
> -
error C2248: 'base::~base' : cannot access protected member declared in
-
class 'base'
-
> -
class base
-
{
-
protected:
-
~base() {}
-
private:
-
void foo()
-
{
-
base* b = new base;
-
delete b;
-
}
-
};
-
>
-
class derived : public base
-
{
-
public:
-
~derived() {}
-
private:
-
void goo()
-
{
-
base* b = new derived;
-
delete b; // error in this line
-
}
-
};
-
>
>
thanks in advance,
George
| | | | re: derived class can not access base class protected member?
Hi Peter,
I am not invoking foo in derived class, the error occurs when I invoke
destructor (protected, by using the statement delete b below). I am confused
why I can not access the protected method of base class in derived class?
void goo()
{
base* b = new derived;
delete b; // error in this line
}
have a good weekend,
George
"Peter Oliphant" wrote: Quote: Quote:
private:
void foo()
>
Because foo( ) is defined as PRIVATE (not protected) in the base class
(typo?)... ;)
>
[==Peter==]
>
"George" <George@discussions.microsoft.comwrote in message
news:D783AA73-AC91-45C2-B534-112BEFEC3BAA@microsoft.com... Quote:
Hello everyone,
I met with a strange issue that derived class function can not access base
class's protected member. Do you know why?
Here is the error message and code. -
error C2248: 'base::~base' : cannot access protected member declared in
-
class 'base'
-
-
class base
-
{
-
protected:
-
~base() {}
-
private:
-
void foo()
-
{
-
base* b = new base;
-
delete b;
-
}
-
};
-
-
class derived : public base
-
{
-
public:
-
~derived() {}
-
private:
-
void goo()
-
{
-
base* b = new derived;
-
delete b; // error in this line
-
}
-
};
-
thanks in advance,
George
>
>
|  | Similar .NET Framework bytes | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,449 network members.
|