当我尝试转换为基类时,为什么编译器会抱怨?

时间:2010-05-21 12:38:12

标签: c++ inheritance

BaseClass.h

class BaseClass
{
 ...
};

SubClass.h

#include "BaseClass.h"
class SubClass : public BaseClass
{
 ...
};

MyApp.h

class BaseClass;
class SubClass;
class MyApp
{
 SubClass *pObject;

 BaseClass *getObject()
 {
  return pObject;
 }
};

我得到编译器错误:错误C2440:'return':无法从'SubClass *'转换为'BaseClass *'

为什么它不起作用,当然你可以在没有任何演员的情况下自动转换为基类?

7 个答案:

答案 0 :(得分:5)

仅发布您已测试的代码以展示所描述的行为。

您的代码,删除了“pOject”拼写错误和“...”部分,编译得很好。

在OP完全重写问题后进行编辑:

MyApp.h中的代码不知道SubClass是BaseClass的子类,因为您没有包含标头。所有MyApp.h看到的都是类的前向声明,它允许处理指针但不允许强制转换。

答案 1 :(得分:4)

"MyApp.h"中,您只有类的前向声明,因此不知道一个派生自另一个。您需要在"SubClass.h"的正文之前加入getObject();要么从"MyApp.h"包含它,要么将getObject()的正文移动到源文件中并从那里包含它。

答案 2 :(得分:2)

SubClass在您的示例中不是BaseClass子类。

除此之外,您的示例在我的g ++中正确编译。

使用上一次编辑,你正在声明2个类,并且编译器不会知道那个是另一个的子类,因此没有可用的转换。

答案 3 :(得分:2)

修改:在MyApp.h #include "SubClass.h"中,您应BaseClass。你所拥有的前向声明没有关于一个是另一个的子类的信息。


关于你的第一篇帖子的问题:(试图将BaseClass存储在子类中)

让它混淆了。 (您的编辑解决了问题)

SubClass指针或引用可以保存{{1}}内存地址。不是相反。

子类是基类,这就是为什么所有基类的方法和属性都将应用于它。

如果你有另一种方式,你可以在子类指针或引用中存储基类地址,那么这是一个问题,因为你可以调用一个基类对象不支持的方法。

答案 4 :(得分:2)

MyApp.h没有告诉编译器SubClass继承自BaseClass - 你可能应该在myapp.h文件中包含baseclass.h和subclass.h,只要你在那里内联getObject()。

答案 5 :(得分:2)

因为您的类是前向声明的,所以在解析头文件时,编译器不知道这两种类型是相关的。

您应该将此方法移至要包含MyApp.cpp的源文件SubClass.h

答案 6 :(得分:0)

该代码适用于我g++ -pedantic(将pOject更改为pObject后)。错误必须在其他地方。

您的更新代码包含错误:

class BaseClass;
class SubClass;

编译器如何知道这两个类是否相关?从编译器的角度来看,类没有任何关系,所以它们不能互换。

删除前向声明,而不是#include "SubClass.h"以使代码正常工作。