derived class can not access base class protected member?

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
 
D

David Lowndes

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
 
G

Guest

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
 
D

David Lowndes

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
 
G

Guest

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
 
D

David Lowndes

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
 
G

Guest

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
 
G

Guest

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
 
D

David Lowndes

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
 
B

Ben Voigt [C++ MVP]

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.
 
G

Guest

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
 
B

Ben Voigt [C++ MVP]

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.
 
G

Guest

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.
 
P

Peter Oliphant

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
 
G

Guest

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top