class classa {
public:
virtual void foo();
};
class classb : public classa {
public:
virtual void foo() override;
};
void classa::foo()
{
std::cout << "foo from a" << std::endl;
}
void classb::foo()
{
std::cout << "foo from b" << std::endl;
}
int main()
{
std::vector<classa> stuff;
classa a;
classb b;
stuff.push_back(a);
stuff.push_back(b);
stuff[0].foo();
stuff[1].foo();
return 0;
}
I expected the above code to return
foo from a
foo from b
but it returns both as foo from a
.
I think this is because the vector stores classa
but I am not sure.
How can I get classb:foo()
to be called by b
?
This happens because of object slicing, you'll need to keep a vector of pointers (preferably smart pointers).
I'm assuming
stuff
is defined asstd::vector<classa> stuff;
. When you dothe object pushed into the vector is a slice of
b
- particulary theclassa
part. All other type info is lost. For this to work as expected, you'd need:or similar. The way your code is now, you can't get it to work because
stuff[1]
is no longer aclassb
, but aclassa
.