具有多个层次的抽象类

时间:2013-06-13 09:01:56

标签: c++ inheritance polymorphism

我写了以下代码。

#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-&gt; parseData函数?根据我的理解,因此类'Last'和'USB'派生自'Inter'类,它应该可以调用吗?..

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

2 个答案:

答案 0 :(得分:4)

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

Inter *obj = new Last;

Last *obj = new Last;

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

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

答案 1 :(得分:1)

parseData()中不存在CI方法。即使parseData()成为virtual,它仍然无法找到。请记住,虚函数只会覆盖基类的行为,但调用这样的函数只能通过指向已经具有此类函数的类的指针来实现。层次结构中第一个在其界面中具有parseData()的类是Inter

因此,要解决此问题,您可以将obj定义为Inter*,也可以将其投放到Inter*的呼叫网站上的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);

}

Live Example