4

我已经编写了以下代码。

#include <iostream>

using namespace std;

class CI
{
 public:
 virtual void display() =0; 
};


class Inter: public CI
{
 public:
  int parseData (int);
};

Inter::parseData (int data)
{
  cout <<"Parsing the data "<<data;
  return data*100;
}



class Last: public Inter
{
 public:
  void display();
};

void Last::display()
{
  cout <<" Last:: Displaying From Last "<<endl;
}

class USB: public Inter
{
 public:
  void display();
};


void USB::display()
{
  cout <<" USB:: Displaying From Last "<<endl;
}
int main ( int argc, char ** argv)
{
  int temp;
  CI *obj = new Last;

  obj->display();
  temp = obj->parseData (100);
  cout <<"Parsed DAta .. "<<temp<<endl;
  delete obj;

  obj = new USB;
  obj->display();
  temp = obj->parseData (200);

}

我的问题是:

为什么我不能调用 obj->parseData 函数?据我了解,因此类“Last”和“USB”派生自“Inter”类,它应该是可调用的吗?

请告诉我我的理解错在哪里?

4

2 回答 2

4

obj必须声明为Last *,或至少声明为Inter *

Inter *obj = new Last;

或者

Last *obj = new Last;

如果obj只是 a CI *,则编译器看不到该parseData()方法(您的对象被实例化为 Last,但立即隐式转换为 CI 并失去了该方法的好处)。

我建议你寻找这个概念的upcast含义。(另请参阅implicit conversion 此处或其他)...

于 2013-06-13T09:08:34.120 回答
1

该方法parseData()不存在于CI. 就算parseData()做成了virtual,还是找不到。请记住,虚函数只会覆盖基类的行为,但调用此类函数只能通过指向已具有此类函数的类的指针发生。层次结构中的第一个类在parseData()其接口中是Inter.

因此,要解决它,您可以定义obj为 a Inter*,也可以Inter*在 的调用点将其转换为 a parseData。前者是首选

int main ( int argc, char ** argv)
{
  int temp;
  Inter *obj = new Last;

  obj->display();
  temp = obj->parseData (100);
  cout <<"Parsed DAta .. "<<temp<<endl;
  delete obj;

  obj = new USB;
  obj->display();
  temp = obj->parseData (200);

}

活生生的例子

于 2013-06-13T09:10:31.817 回答