在C ++中协助继承问题

时间:2016-06-02 21:24:02

标签: c++ inheritance

我有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())

2 个答案:

答案 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