具有多层的抽象类
Abstract Class with Multiple Levels
我编写了以下代码:
#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);
}
生活例子。
相关文章:
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 派生类可以有多个指向虚拟表的指针
- 非指针类成员:它有多好?
- 访客设计模式和多层类层次结构
- 当我有多个类时,我应该以线性样式包含它们还是只包含在 main.cpp 中?
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 类X有多个默认构造函数和对重载函数的模糊调用
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- 使用抽象类何时有意义
- "Has a" C++关系,最佳做法是让一个类"implement"多个抽象基类?
- 类有多个构造函数
- 包括抽象类或多态类C++
- cout上抽象类的多态性
- 具有多层的抽象类
- 当目标类有多个构造函数时,消除强制转换操作符的歧义
- 当类有多个模板参数时,专门化成员模板
- 为什么抽象类有一个虚函数表?
- 抽象类和多态性
- C++抽象类和多态性
- 具有抽象类的多态性(C++)