我有2个C ++类(A和B),比方说B继承自A.
他们都需要一个toString()函数。它们是从返回基类类型的函数调用的。返回后,我想调用tostring()函数来获取正确类型的类。如果函数返回B类型对象,我想从B类调用toString()。
我认为我的问题来自于函数返回对基类的引用,因此它从基类调用函数。
示例类:
class A
{
std::string toString();
};
class B
: public A
{
int extraThingToPrint;
std::string toString(); //prints a different message than the A version
};
示例功能:
A otherClass::scan()
{
if(otherVar == 'a') return A();
else if(otherVar == 'bb') return B();
}
std::cout << scan().toString(); //if bb plz print B.toString() and not A.toString() (but if a, use A.toString())
答案 0 :(得分:3)
otherClass::scan()
按值返回A
。当您尝试返回B()
时,会导致切片,并且仅返回A
部分。无论你在函数内写什么,返回对象的真实类型都是A
。
您需要返回引用或[智能]指针才能使动态分派工作。
答案 1 :(得分:0)
首先toString
需要在基类中是虚拟的,然后需要将引用(或指针)返回到指向基类或派生类对象的基类类型。像这样:
class A
{
virtual std::string toString();
};
A* otherClass::scan()
{
A* ret;
if(otherVar == 'a')
ret=new A();
else if(otherVar == 'bb');
ret=new B();
return ret;
}
A* ret=scan();
std::cout << ret->toString();
delete ret;//delete once you are done