C++ 多层次抽象类

C++ 多层次抽象类,c++,inheritance,polymorphism,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 "<<dat

我已经编写了以下代码

#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);

}
#包括
使用名称空间std;
CI类
{
公众:
虚空显示()=0;
};
类间:公共CI
{
公众:
int解析数据(int);
};
Inter::parseData(int数据)
{

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

Inter *obj = new Last;

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

我建议您看看
向上转换的概念是什么意思(另请参阅关于
隐式转换
或其他)

方法
parseData()
不在
CI
中。即使
parseData()
将被设置为虚拟的
它仍然找不到。请记住,虚拟函数只会覆盖基类的行为,但调用此类函数只能通过指向已具有此类函数的类的指针进行。层次结构中具有
parseData()的第一个类
在其界面中是
Inter

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

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);

}
int main(int argc,char**argv)
{
内部温度;
Inter*obj=新的最后一个;
obj->display();
temp=obj->parseData(100);

不可以,因为obj是CI类型,而parseData不是虚拟的,所以它将只在CI类中查找parseData实现。如果您希望方法可用,则必须使用指向声明该方法的级别的指针。
parseData
未在
CI
中声明
CI
类没有
parseData()
方法,无论它是否是
virtual
。在这种情况下,类型转换不是一种好方法-应该尽可能避免,这里最好使用type
Inter
作为指针
obj
@spongebob谢谢,我更新了我的答案以反映您的观点。
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);

}