2013-06-13 61 views
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'类派生的,它应该可以被调用吗?

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

+1

否因为obj是CI类型的,parseData不是虚拟的,它只会在CI类中寻找parseData实现 – sethi

+1

如果你想要一个方法可用,你必须使用一个指向它声明的级别的指针。 'parseData'没有在'CI'中声明。 – StoryTeller

回答

4

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

Inter *obj = new Last; 

Last *obj = new Last; 

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

我建议你看看upcast的含义是什么意思。 (另见约implicit conversionhere或其他)...

1

该方法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); 

} 

Live Example

+0

'CI'类没有'parseData()'方法,不管它是否'虚拟'。在这种情况下类型转换并不是一种好的方法 - 尽可能避免这种情况,这里最好使用类型为'Inter'的指针'obj'。 – SpongeBobFan

+0

@SpongeBobFan谢谢你,我更新了我的答案以反映你的观点。 – TemplateRex