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数据)
{
coutobj
必须声明为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
。在这种情况下,类型转换不是一种好方法-应该尽可能避免,这里最好使用typeInter
作为指针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);
}