C++ Inheritance: Derived class pointer to a Base class invokes Derived class method

前端 未结 6 1796
眼角桃花
眼角桃花 2021-01-25 20:28

I am learning C++ inheritance, so I tried this code by creating a Base class dynamically and made a downcast to its Derived class (obviously its not valid to downcast) in order

6条回答
  •  执念已碎
    2021-01-25 20:40

    As @Mark Ransom has suggested in the comments, I looked the post When does invoking a member function on a null instance result in undefined behavior?. Then I came up with my own solution.

    This behavior of invoking a non created object's method is not a matter of fact with the parent class nor child class or downcast or inheritance . I had statically told to call the child::who() by downcasting, the compiler calls child::who() without caring about the object type.

    But how the who() method is called since no object is created for child class?

    The method which I tried to invoke doesn't have any member variable so there is no need to dereference this pointer. It just calls who(), the same behavior is true if the child class pointer points to NULL also.

    child *c = NULL;
    c->who(); 
    

    It prints I am child even though c points to NULL. Because no need to dereference this pointer. Lets have a situation where who() method contains a member variable x as below.

    class child : public parent{
        private:
            int x;
        public:
            void who(){
                x = 10;
                cout << "I am child " << x;
            }
    };
    
    child *c = NULL;
    c->who()
    

    Now it causes Segmentation fault because in order to use x the compiler have to dereference this pointer for x as (*this).x. Since this points to NULL dereferencing will cause Segmentation fault. This is clearly an undefined behavior.

提交回复
热议问题