2010-11-23 137 views
1

假设我有一个抽象基类A,并从中派生B.C++:返回子类指针

用下面的代码:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

第一功能编译,第二不。错误:error C2143: syntax error : missing ';' before '*'

  • 为什么我不能返回指向子类A的指针?

如果我用return NULL;替换函数的内容,也会出现错误!

+0

函数声明后面的额外分号似乎很奇怪。尝试删除它。 – Lagerbaer 2010-11-23 15:39:06

+0

不用说,函数原来是inline – Parror 2010-11-23 15:39:53

+0

这个错误实际上是指哪一行?您可能想向我们展示整个代码,因为`;`错误可能不仅仅意味着缺少分号(模糊,是) – birryree 2010-11-23 15:41:50

回答

0

你试过了大括号后的尾部分号?例如:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

注:我没有尝试过这个,因为我没有访问C++编译器在这一刻......

4

的问题是最有可能的是,编译器不知道AB是。包括最有可能的失踪。

但除此之外,永远不要将C风格类型与类一起使用。或者甚至更好。

使用static_cast(如果您确定转换正常)或dynamic_cast(如果您需要检查)。

0

我会猜测,这些行出现在实际代码中的单独文件中,因为如果它们出现在显示中,我看不到任何错误。

最有可能发生的情况是,在定义了GetB的任何地方,您忘记了包含B,并且编译器无法弄清楚它是一种类型。

此外,如果您还使用static_cast而不是C风格转换,编译器会警告您是否无法确定AB之间的关系。

1

注意C++中的C风格转换。作为一个经验法则:从来没有使用它们。使用适当的C++强制转换。

除此之外,第一投是完全多余:

A* myInst = new B; 

A* GetA() { return myInst; } 
B* GetB() { return static_cast<B*>(myInst); } 

这工作得很好。

0

大多数情况下,你不应该投掷。

B bInst 
A * myInst = &bInst; 
A* getA() { return &bInst; } 
B* getB() { return &bInst; } 

简单!

在极少数情况下,您需要放下层次结构。通常这是加载某种附件的地方,需要检查一个对象是否是您期望的类型。在这种情况下,您可以使用dynamic_cast <>来检查,但必须有RTTI。

另一种情况发生在存储不相关类型的地方,例如变体/“任何”类型,这些类型仅与它们一起存储在单个集合中的事实相关,并且可能在检索后以不同方式处理。这也可能发生在状态机中。尽管可能在这里设计流程以避免铸造,但有时铸造更容易。在这种情况下,尽管你确切地知道你有什么类型,并且可以在层次结构中static_cast到它。