TheWinterSnow
TheWinterSnow

Reputation: 175

C++ Creating variables from protected abstract/derived class

I am trying to figure out where I am going wrong with creating variables from a derived class. I have the abstract class, the derived class and am trying to create the derived class as a variable in the main testing program. However I get the error: no matching function for call to DerivedPlayer::DerivedPlayer()’. I haven't been able to find the correct syntax as to create and initialize a variable of the derived class. Also note that the abstract class's constructor is protected.

Abstract Header (Base.h)

    #ifndef BASE_H_
    #define BASE_H_

    #include <iostream>
    #include <vector>

    class Base {
      public:
        virtual ~Base() {}

      protected:
        Base(std::string s) : x(0), s(s), v(0) {}

        int x;
        std::string s;
        std::vector<int> v;
    };
    #endif

Derived Header (Derived.h)

    #ifndef DERIVED_H_
    #define DERIVED_H_

    #include "Base.h"

    class Derived : public Base {
    public:
        Derived(std::string name){ s = name; }
        virtual ~Derived();
    };

    #endif

Test Code (InTest.cpp)

    #include <iostream>
    #include "Derived.h"

    int main() {

        Derived a = Derived("R2-D2");
        Derived b = Derived("C-3PO");

        return 0;
    }

Build Log

    03:23:52 **** Incremental Build of configuration Debug for project InTest ****
    make all 
    Building file: ../src/InTest.cpp
    Invoking: GCC C++ Compiler
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/InTest.d" -MT"src/InTest.o" -o "src/InTest.o" "../src/InTest.cpp"
    In file included from ../src/InTest.cpp:2:0:
    ../src/Derived.h: In constructor ‘Derived::Derived(std::string)’:
    ../src/Derived.h:8:27: error: no matching function for call to ‘Base::Base()’
      Derived(std::string name){ s = name; }
                               ^
    ../src/Derived.h:8:27: note: candidates are:
    In file included from ../src/Derived.h:4:0,
                     from ../src/InTest.cpp:2:
    ../src/Base.h:12:2: note: Base::Base(std::string)
      Base(std::string s) : x(0), s(s), v(0) {}
      ^
    ../src/Base.h:12:2: note:   candidate expects 1 argument, 0 provided
    ../src/Base.h:7:7: note: Base::Base(const Base&)
     class Base {
           ^
    ../src/Base.h:7:7: note:   candidate expects 1 argument, 0 provided
    make: *** [src/InTest.o] Error 1

    03:23:52 Build Finished (took 214ms)

Upvotes: 0

Views: 48

Answers (1)

Some programmer dude
Some programmer dude

Reputation: 409196

Here's the main part of the error message:

../src/Derived.h: In constructor ‘Derived::Derived(std::string)’:
../src/Derived.h:8:27: error: no matching function for call to ‘Base::Base()’
  Derived(std::string name){ s = name; }

Because Derived inherits from Base, each time a Derived object is constructed the Base class constructor also have to run. The problem with your current code is that you let the default Base constructor be called, but there isn't any.

You solve it by "calling" the correct Base constructor in the Derived constructor initializer list:

Derived::Derived(std::string name)
    : Base(name)
{}

Upvotes: 1

Related Questions