Undefined reference to `typeinfo for class' and undefined reference to `vtable for class'

14,489

Solution 1

root::setSize isn't declared pure virtual, which means it must be defined. Presumably, it should be as pure as the other functions:

virtual void setSize(int) = 0;
                          ^^^

If you're interested in the gory details of why you get that particular error: this compiler needs to generate the class's virtual/RTTI metadata somewhere and, if the class declares a non-pure, non-inline virtual function, it will generate it in the same translation unit as that function's definition. Since there is no definition, they don't get generated, giving that error.

Solution 2

Your root::setSize is not defined, and not declared an pure virtual function. Either add = 0 to the end of the function (making it pure virtal), or define a root::setSize function.

Solution 3

I believe it's because you haven't implemented

    virtual void setSize(int);

in root or declared it as pure virtual by adding =0

Share:
14,489
Brian Brown
Author by

Brian Brown

B'ham fellow

Updated on June 23, 2022

Comments

  • Brian Brown
    Brian Brown almost 2 years

    I'm dealing with inheritance in C++. I wanted to write a program for addition and subtraction of two arrays. Heres my code:

    #include <iostream>
    #include <cmath>
    #include <sstream>
    using namespace std;
    
    class root
    {
        protected :
    
                int size;
                double *array;
    
        public :
    
            virtual ~root() {}
            virtual root* add(const root&) = 0;
            virtual root* sub(const root&) = 0;
            virtual istream& in(istream&, root&) = 0;
    
            virtual int getSize() const = 0;
            virtual void setSize(int);
            virtual int getAt(int) const = 0;
    };
    
    class aa: public root
    {
    
        public :
    
            aa();
            aa(int);
            aa(const aa&);
            root* add(const root& a);
            root* sub(const root& a);
            istream& in(istream&, root&){}
            int getSize() const;
            void setSize(int);
            int getAt(int) const;
    };
    
    class bb: public root
    {
    public:
        bb() { }
        bb(const bb& b) { }
        root* add(const root& a);
        root* sub(const root& a);
        istream& in(istream&, root&){}
        int getSize() const{}
        void setSize(int){}
        int getAt(int) const{}
    };
    
    aa::aa()
    {
        size = 0;
        array = NULL;
    }
    
    aa::aa(int nsize)
    {
        size = nsize;
        array = new double[size+1];
        for(int i=0; i<size; i++)
            array[i] = 0;
    }
    
    root* aa::add(const root& a)
    {
        for (int i=0; i<a.getSize(); i++)
            array[i] += a.getAt(i);
        return new aa();
    }
    
    root* aa::sub(const root& a)
    {
    }
    
    int aa::getSize() const
    {
        return size;
    }
    
    void aa::setSize(int nsize)
    {
        size = nsize;
        array = new double[size+1];
        for(int i=0; i<size; i++)
            array[i] = 0;
    }
    
    int aa::getAt(int index) const
    {
        return array[index];
    }
    
    root* bb::add(const root& a)
    {
        return new bb();
    }
    
    root* bb::sub(const root& a)
    {
    
    }
    
    int main(int argc, char **argv)
    {
    }
    

    But I have a strange errors:

    /home/brian/Desktop/Temp/Untitled2.o||In function `root::~root()':|
    Untitled2.cpp:(.text._ZN4rootD2Ev[_ZN4rootD5Ev]+0xb)||undefined reference to `vtable for root'|
    /home/brian/Desktop/Temp/Untitled2.o||In function `root::root()':|
    Untitled2.cpp:(.text._ZN4rootC2Ev[_ZN4rootC5Ev]+0x8)||undefined reference to `vtable for root'|
    /home/brian/Desktop/Temp/Untitled2.o:(.rodata._ZTI2bb[typeinfo for bb]+0x8)||undefined reference to `typeinfo for root'|
    /home/brian/Desktop/Temp/Untitled2.o:(.rodata._ZTI2aa[typeinfo for aa]+0x8)||undefined reference to `typeinfo for root'|
    ||=== Build finished: 4 errors, 0 warnings ===|
    

    dont know from where they came from, dont now how to 'fix' them. Thanks in advance;)

  • Nick
    Nick almost 11 years
    +1 for giving the gory details!