derived class can not access base class protected member?

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

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.

Code:
error C2248: 'base::~base' : cannot access protected member declared in
class 'base'

Code:
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
 
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
 
Hi Dave,


What do you mean
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
 
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
 
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
 
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
 
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?


regards,
George
 
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?


regards,
George
 
A derived class can access *its* base class protected members, but
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
 
George said:
So, Dave, as you mentioned below,


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.
 
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
 
George said:
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.
 
Thanks Ben,


I am clear now.


regards,
George

Ben Voigt said:
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.
 
private:
void foo()

Because foo( ) is defined as PRIVATE (not protected) in the base class
(typo?)... ;)

[==Peter==]

George said:
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.

Code:
error C2248: 'base::~base' : cannot access protected member declared in
class 'base'

Code:
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
 
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 said:
private:
void foo()

Because foo( ) is defined as PRIVATE (not protected) in the base class
(typo?)... ;)

[==Peter==]

George said:
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.

Code:
error C2248: 'base::~base' : cannot access protected member declared in
class 'base'

Code:
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
 
Back
Top