Search code examples
c++inheritanceconstructorinitializer-list

Using parent class constructor initialiser-list in C++


ORIGINAL POST

When compiled, the following code produces error C2436: '__ctor' : member function or nested class in constructor initializer list

in Child.h

#include Parent.h
class  Child : public Parent  
{
    public:
        Child (List* pList) 
            : Parent::Parent(pList)
        {
        }
};

Here the parent class:

in Parent.h

class __declspec(dllimport) Parent : public GrandParent  
{
    public:
       Parent (List* pList = NULL);
}

in Parent.cpp

Parent::Parent (List* pList)
: 
    m_a(1)
   ,m_b(1)
   ,GrandParent(pList)
{
}

Isn't it right the way to make the Child class calling the Parent class constructor?

PS Same happens if I split declaration and implementation of Child constructor into .h and .cpp. I cannot change the parent class code, as it is part of a pre-compiled library.

AFTER YOUR SUGGESTIONS, @Mape, @Mat, @Barry, @Praetorian

I realised the problem is due to the presence of another constructor in the Parent class. Thanks to your suggestions I generated the code reproducing the error (minimal, complete and verifiable) in a new post Managing in Child class multiple constructors (with initializer-lists) of parent class


Solution

  • Adapted from your example, this compiles fine. Parent::Parent should be just Parent.

    #define NULL 0
    
    struct List;
    
    class GrandParent
    {
        public:
           GrandParent(List* pList = NULL) {}
    };
    
    
    class Parent : public GrandParent
    {
        public:
           Parent(List* pList = NULL);
           int m_a;
           int m_b;
    };
    
    Parent::Parent(List* pList)
    :
        m_a(1)
       ,m_b(1)
       ,GrandParent(pList)
    {
    }
    
    class  Child : public Parent
    {
        public:
            Child (List* pList)
                : Parent(pList)
            {
            }
    };
    
    int main(void)
    {
        GrandParent grandparent(NULL);
        Parent parent(NULL);
        Child child(NULL);
    
        return 0;
    }