我一直试图理解一段代码:
class A {
// some class definition
}
class B {
public:
virtual A *someMethod();
virtual class A *someOtherMethod();
}
我似乎无法理解someMethod
和someOtherMethod
之间的区别(或者是否有任何存在) - 两者似乎都是虚方法,并且在类中都被覆盖继承自B.
有人可以对这个虚拟类语法有所了解吗?
答案 0 :(得分:5)
A
是类名称,class A
是详细类型说明符。
如果没有其他名为A
的内容,则两者都会引用名为A
的类。
如果还有一些名为A
的其他东西(可能是一个函数或变量),那么A
的无限制使用就会引用它。您需要精心设计的说明符class A
来引用该类。正如评论中所提到的,您也可以使用class A
而无需事先声明该类;使用详细说明符足以将类名引入最里面的命名空间。
它与虚函数语法没什么关系;两种形式都可用于指定类型,无论是作为函数的返回类型还是在任何其他上下文中。
答案 1 :(得分:1)
在C中,您曾经必须编写struct S
来引用结构。实际上有这种模式来处理它:typedef S struct {}
,它创建一个未命名的结构,然后通过类型别名给它起名字S.
C ++保留了此功能,但会自动为原始类型添加别名。在您的情况下,A
是正式名称class A
的类型别名。当然,如果你有多个A
,自动别名将无效,但这也是一个非常大的代码味道。
TL; DR:两个函数都返回相同的东西。它是C的残余,用于向后兼容,在使用时非常不赞成。