undefined reference to vtable


E

eric

Dear Advanced C/g++ programers:

a simple program about Creating an interface with an Abstract Base
Class. from book (C++ cookbook) page 308, 309. Example 8-11. using a
pure interface.
----------------------
// Example 8-11 Using a pure interface
class Person {
public:
virtual void eat() = 0;
virtual void sleep() = 0;
virtual void walk() = 0;
virtual void jump() = 0;
};

class IAirbone {
public:
virtual void fly() = 0;
virtual void up() = 0;
virtual void down() = 0;
};

class Superhero : public Person, // A superhero *is* a person
public IAirbone { // and flies
public:
virtual void eat();
virtual void sleep();
virtual void walk();
virtual void jump();
virtual void fly();
virtual void up();
virtual void down();
virtual ~Superhero();
};

void Superhero::walk() {
// ...
}

void Superhero::fly() {
// ...
}

// Implement all of the pure virtuals in Superhero's Superclasses...

int main() {

Superhero superman;
superman.walk(); // Superman can walk like a person
superman.fly(); // or fly like a bird
}
---------------------------------------------------
my g++ 4.5.2 (on linux2.6.35-25) response by
-------------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-11.cpp
/tmp/ccT3nO5t.o: In function `main':
Example8-11.cpp:(.text+0x47): undefined reference to
`Superhero::~Superhero()'
/tmp/ccT3nO5t.o: In function `Superhero::Superhero()':
Example8-11.cpp:(.text._ZN9SuperheroC2Ev[_ZN9SuperheroC5Ev]+0x24):
undefined reference to `vtable for Superhero'
Example8-11.cpp:(.text._ZN9SuperheroC2Ev[_ZN9SuperheroC5Ev]+0x2e):
undefined reference to `vtable for Superhero'
collect2: ld returned 1 exit status
--------------------------------------------------
actually that book even did not specially define Superhero::walk(),
that is
I add by myself to escape my compile's error(is that right? or book's
is right?)
you can download the source code of that book's example and test by
yourself
http://examples.oreilly.com/9780596007614/
according to book, thses code are compile good in visual c++ 7.1 on
window xp
thanks your help a lot in advance, Eric
 
Ad

Advertisements

I

Ian Collins

Dear Advanced C/g++ programers:

a simple program about Creating an interface with an Abstract Base
Class. from book (C++ cookbook) page 308, 309. Example 8-11. using a
pure interface.
----------------------
// Example 8-11 Using a pure interface
class Person {
public:
virtual void eat() = 0;
virtual void sleep() = 0;
virtual void walk() = 0;
virtual void jump() = 0;
};

class IAirbone {
public:
virtual void fly() = 0;
virtual void up() = 0;
virtual void down() = 0;
};

class Superhero : public Person, // A superhero *is* a person
public IAirbone { // and flies
public:
virtual void eat();
virtual void sleep();
virtual void walk();
virtual void jump();
virtual void fly();
virtual void up();
virtual void down();

None of the above need the "virtual" key word.
virtual ~Superhero();

Why have you given this a virtual destructor?

--------------------------------------------------
actually that book even did not specially define Superhero::walk(),
that is
I add by myself to escape my compile's error(is that right? or book's
is right?)

They must be defined.
 
Ad

Advertisements

A

Arvind

Dear Advanced C/g++ programers:

a simple program about Creating an interface with an Abstract Base
Class. from book (C++ cookbook) page 308, 309. Example 8-11. using a
pure interface.
----------------------
// Example 8-11 Using a pure interface
class Person {
public:
virtual void eat() = 0;
virtual void sleep() = 0;
virtual void walk() = 0;
virtual void jump() = 0;

};

class IAirbone {
public:
virtual void fly() = 0;
virtual void up() = 0;
virtual void down() = 0;

};

class Superhero : public Person, // A superhero *is* a person
public IAirbone { // and flies
public:
virtual void eat();
virtual void sleep();
virtual void walk();
virtual void jump();
virtual void fly();
virtual void up();
virtual void down();
virtual ~Superhero();

};

void Superhero::walk() {
// ...

}

void Superhero::fly() {
// ...

}

// Implement all of the pure virtuals in Superhero's Superclasses...

int main() {

Superhero superman;
superman.walk(); // Superman can walk like a person
superman.fly(); // or fly like a bird}

---------------------------------------------------
my g++ 4.5.2 (on linux2.6.35-25) response by
-------------------------------------
[email protected]:~/cppcookbook/ch8$ g++ Example8-11.cpp
/tmp/ccT3nO5t.o: In function `main':
Example8-11.cpp:(.text+0x47): undefined reference to
`Superhero::~Superhero()'
/tmp/ccT3nO5t.o: In function `Superhero::Superhero()':
Example8-11.cpp:(.text._ZN9SuperheroC2Ev[_ZN9SuperheroC5Ev]+0x24):
undefined reference to `vtable for Superhero'
Example8-11.cpp:(.text._ZN9SuperheroC2Ev[_ZN9SuperheroC5Ev]+0x2e):
undefined reference to `vtable for Superhero'
collect2: ld returned 1 exit status
--------------------------------------------------
actually that book even did not specially define Superhero::walk(),
that is
I add by myself to escape my compile's error(is that right? or book's
is right?)
you can download the source code of that book's example and test by
yourselfhttp://examples.oreilly.com/9780596007614/
according to book, thses code are compile good in visual c++ 7.1 on
window xp
thanks your help a lot in advance, Eric

Just look at the error "Example8-11.cpp:(.text+0x47): undefined
reference to
`Superhero::~Superhero()'".
Fix it. Define the destructor for Superhero because you have declared
this in Superhero class.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top