class BaseClass
{
...
};
#include "BaseClass.h"
class SubClass : public BaseClass
{
...
};
class BaseClass;
class SubClass;
class MyApp
{
SubClass *pObject;
BaseClass *getObject()
{
return pObject;
}
};
我得到编译器错误:错误C2440:'return':无法从'SubClass *'转换为'BaseClass *'
为什么它不起作用,当然你可以在没有任何演员的情况下自动转换为基类?
答案 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"
以使代码正常工作。