具有多层的抽象类

Abstract Class with Multiple Levels

本文关键字:抽象类 有多层      更新时间:2023-10-16

我编写了以下代码:

#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',它应该是可调用的,对吗?

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

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

Inter *obj = new Last;

Last *obj = new Last;

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

我建议您查找upcast的概念是什么意思。(参见implicit conversion)…

方法parseData()不存在于CI中。即使parseData()将成为virtual,它仍然找不到。请记住,虚函数只会覆盖基类的行为,但是调用这样的函数只能通过指向已经具有此类函数的类的指针来实现。在你的层次结构中,接口中有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);
}

生活例子。