Casting changes value of ptr

Discussion in 'C++' started by Vinodh Kumar, Jul 31, 2003.

  1. Vinodh Kumar

    Vinodh Kumar Guest

    I see that casting changes the value of a pointer in case of multiple
    inheritance.In single inheritance also it is the same know?Isn't it?

    Vinodh Kumar P
    Vinodh Kumar, Jul 31, 2003
    #1
    1. Advertising

  2. "Vinodh Kumar" <> wrote in message
    news:bga8us$j8q$...
    > I see that casting changes the value of a pointer in case of multiple
    > inheritance.In single inheritance also it is the same know?Isn't it?
    >
    > Vinodh Kumar P
    >


    It can happen, for instance if the derived class has virtual functions and
    the base class does not.

    #include <iostream>
    using namespace std;

    class A
    {
    int a;
    };

    class B : public A
    {
    virtual ~B() {}
    int b;
    };

    int main()
    {
    B* b = new B;
    A* a = b;
    cout << a << ' ' << b<< '\n';
    }

    Basically this is an area where you shouldn't mind if a cast or conversion
    changes the pointer value. Do you think its a problem, or are you just
    trying to learn more about C++?

    john
    John Harrison, Jul 31, 2003
    #2
    1. Advertising

  3. John Harrison wrote:

    >
    >
    > It can happen, for instance if the derived class has virtual functions and
    > the base class does not.


    But having a base class with no virtual destructor is asking for trouble.

    >
    > #include <iostream>
    > using namespace std;
    >
    > class A
    > {
    > int a;
    > };


    Note no virtual destructor.

    >
    > class B : public A
    > {
    > virtual ~B() {}
    > int b;
    > };
    >
    > int main()
    > {
    > B* b = new B;
    > A* a = b;
    > cout << a << ' ' << b<< '\n';


    Assuming you want to prevent memory leaks, you'd obviously need to free
    the allocated object. This:

    delete a;

    Creates undefined behavior. In this particular case it's easy to work
    around. You just do this instead:

    delete b;

    But in general you may have a pointer of type A* which may point to some
    derived class, which is not known. The only safe way to delete it (in
    the absence of a virtual destructor) is to first cast it to the exact
    correct pointer type. This can obviously be a major hassle.

    > }
    >
    > Basically this is an area where you shouldn't mind if a cast or conversion
    > changes the pointer value. Do you think its a problem, or are you just
    > trying to learn more about C++?
    >


    I agree - usually, the exact value of a pointer should not matter.

    -Kevin
    Kevin Goodsell, Jul 31, 2003
    #3
  4. Vinodh Kumar

    Vinodh Kumar Guest

    ----- Original Message -----
    From: "Kevin Goodsell" <>
    Newsgroups: comp.lang.c++
    Sent: Thursday, July 31, 2003 12:22 PM
    Subject: Re: Casting changes value of ptr


    > John Harrison wrote:
    >
    > >
    > >
    > > It can happen, for instance if the derived class has virtual functions

    and
    > > the base class does not.

    >
    > But having a base class with no virtual destructor is asking for trouble.
    >
    > >
    > > #include <iostream>
    > > using namespace std;
    > >
    > > class A
    > > {
    > > int a;
    > > };

    >
    > Note no virtual destructor.
    >
    > >
    > > class B : public A
    > > {
    > > virtual ~B() {}
    > > int b;
    > > };
    > >
    > > int main()
    > > {
    > > B* b = new B;
    > > A* a = b;
    > > cout << a << ' ' << b<< '\n';

    >
    > Assuming you want to prevent memory leaks, you'd obviously need to free
    > the allocated object. This:
    >
    > delete a;
    >
    > Creates undefined behavior. In this particular case it's easy to work
    > around. You just do this instead:
    >
    > delete b;
    >
    > But in general you may have a pointer of type A* which may point to some
    > derived class, which is not known. The only safe way to delete it (in
    > the absence of a virtual destructor) is to first cast it to the exact
    > correct pointer type. This can obviously be a major hassle.
    >
    > > }
    > >
    > > Basically this is an area where you shouldn't mind if a cast or

    conversion
    > > changes the pointer value. Do you think its a problem, or are you just
    > > trying to learn more about C++?
    > >

    >
    > I agree - usually, the exact value of a pointer should not matter.


    But the type of the object that is being pointed to difers in case of a
    casting in multiple inheritance.Thats the same case when we cast between
    objects of single inheritance hiearchies.So I conclude that both in single
    and multiple inheritance hierarchies, casting changes the value of the
    pointer.I agree that the exact value of the point doesn't matter.

    "Kevin Goodsell" <> wrote in message
    news:3f28bc98@shknews01...
    > John Harrison wrote:
    >
    > >
    > >
    > > It can happen, for instance if the derived class has virtual functions

    and
    > > the base class does not.

    >
    > But having a base class with no virtual destructor is asking for trouble.
    >
    > >
    > > #include <iostream>
    > > using namespace std;
    > >
    > > class A
    > > {
    > > int a;
    > > };

    >
    > Note no virtual destructor.
    >
    > >
    > > class B : public A
    > > {
    > > virtual ~B() {}
    > > int b;
    > > };
    > >
    > > int main()
    > > {
    > > B* b = new B;
    > > A* a = b;
    > > cout << a << ' ' << b<< '\n';

    >
    > Assuming you want to prevent memory leaks, you'd obviously need to free
    > the allocated object. This:
    >
    > delete a;
    >
    > Creates undefined behavior. In this particular case it's easy to work
    > around. You just do this instead:
    >
    > delete b;
    >
    > But in general you may have a pointer of type A* which may point to some
    > derived class, which is not known. The only safe way to delete it (in
    > the absence of a virtual destructor) is to first cast it to the exact
    > correct pointer type. This can obviously be a major hassle.
    >
    > > }
    > >
    > > Basically this is an area where you shouldn't mind if a cast or

    conversion
    > > changes the pointer value. Do you think its a problem, or are you just
    > > trying to learn more about C++?
    > >

    >
    > I agree - usually, the exact value of a pointer should not matter.
    >
    > -Kevin
    >
    Vinodh Kumar, Jul 31, 2003
    #4
  5. Vinodh Kumar

    Vinodh Kumar Guest

    "tom_usenet" <> wrote in message
    news:...
    > On Thu, 31 Jul 2003 12:46:35 +0530, "Vinodh Kumar"
    > <> wrote:
    >
    > >But the type of the object that is being pointed to difers in case of a
    > >casting in multiple inheritance.Thats the same case when we cast between
    > >objects of single inheritance hiearchies.So I conclude that both in

    single
    > >and multiple inheritance hierarchies, casting changes the value of the
    > >pointer.I agree that the exact value of the point doesn't matter.

    >
    > In single inheritence, in common implementations the cast shouldn't
    > change the value of the pointer. Imagine:
    >
    > class A
    > {
    > int i;
    > virtual ~A();
    > };
    >
    > class B: public A
    > {
    > int j;
    > };
    >
    > B* b = new B;
    > A* a = b;
    >
    >
    > Now, the layout of a B might look like this:
    >
    > vtable ptr (4 bytes)
    > A part: int i; (4 bytes)
    > B part: int j; (4 bytes)
    >
    > Now, if the B object is created at the address 10, say, then the
    > object will run from address 10 though to 22.
    >
    > The value of b above will be 10.
    > The value of a above will also be 10!
    >
    > IOW, the value of the pointer will not change in single inheritence
    > cases.
    >

    class A
    {
    int i;
    virtual ~A();
    };

    class B: public A
    {
    int j;
    };

    class C: public B
    {
    int k;
    }

    Now, the layout of a C might look like this:

    vtable ptr (4 bytes)
    A part: int i; (4 bytes)
    B part: int j; (4 bytes)
    C part: int k;(4 bytes)

    Now, if the B object is created at the address 10, say, then the
    object will run from address 10 though to 24.

    C* c = new C;
    A* a = C;

    The value of c above will be 10.
    The value of a above will also be 10.
    Fine.

    B* b = c;
    Now the value of b will be different.
    So in single inheritence casting changes the value of the pointer if we are
    not casting to top most base class or bottom most derived class.
    Vinodh Kumar, Aug 1, 2003
    #5
  6. Vinodh Kumar

    tom_usenet Guest

    On Fri, 1 Aug 2003 12:06:37 +0530, "Vinodh Kumar"
    <> wrote:

    > class A
    > {
    > int i;
    > virtual ~A();
    > };
    >
    > class B: public A
    > {
    > int j;
    > };
    >
    >class C: public B
    >{
    > int k;
    >}
    >
    > Now, the layout of a C might look like this:
    >
    > vtable ptr (4 bytes)
    > A part: int i; (4 bytes)
    > B part: int j; (4 bytes)
    >C part: int k;(4 bytes)


    Ok, there are certainly implementations that will use that layout.

    >
    > Now, if the B object is created at the address 10, say, then the
    > object will run from address 10 though to 24.


    ?? You don't create a B object on the line below, but a C object.

    >C* c = new C;
    > A* a = C;
    >
    > The value of c above will be 10.


    Ok.

    > The value of a above will also be 10.
    >Fine.


    Ok.

    >
    >B* b = c;
    >Now the value of b will be different.


    Why? It will still be 10 on normal implementations (I don't know of an
    implementation where it will change, and there may well not be one,
    although the standard allows it). The B object doesn't care whether
    it's a subobject of a C object, a D object or whether it isn't a sub
    object at all, but the whole object.

    >So in single inheritence casting changes the value of the pointer if we are
    >not casting to top most base class or bottom most derived class.


    Why do you think that the value will change in the above case? It
    wouldn't make sense for it to change. Try this on your favourite
    compilers:

    class A
    {
    public:
    int i;
    virtual ~A(){}
    };

    class B: public A
    {
    public:
    int j;
    };

    class C: public B
    {
    public:
    int k;
    };

    #include <iostream>

    int main()
    {
    C* c = new C;
    B* b = c;
    A* a = c;

    std::cout << (void*)a << '\n';
    std::cout << (void*)b << '\n';
    std::cout << (void*)c << '\n';
    }

    Tom
    tom_usenet, Aug 4, 2003
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Sid
    Replies:
    5
    Views:
    1,063
  2. Heiko Vogel
    Replies:
    3
    Views:
    544
    Method Man
    Sep 14, 2004
  3. franco ziade

    const ptr to const ptr ?

    franco ziade, Feb 17, 2005, in forum: C Programming
    Replies:
    3
    Views:
    384
    franco ziade
    Feb 17, 2005
  4. G Fernandes
    Replies:
    9
    Views:
    570
    DHOLLINGSWORTH2
    Feb 27, 2005
  5. Jason

    difference between *ptr++ and ++*ptr ?

    Jason, May 15, 2005, in forum: C Programming
    Replies:
    19
    Views:
    6,506
    Chris Torek
    May 19, 2005
Loading...

Share This Page