"虚拟A * someMethod" vs"虚拟类A * someMethod"

时间:2015-03-17 13:10:03

标签: c++ polymorphism

我一直试图理解一段代码:

class A {
    // some class definition
}

class B {
    public:
        virtual A *someMethod();
        virtual class A *someOtherMethod();
}

我似乎无法理解someMethodsomeOtherMethod之间的区别(或者是否有任何存在) - 两者似乎都是虚方法,并且在类中都被覆盖继承自B.

有人可以对这个虚拟类语法有所了解吗?

2 个答案:

答案 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的残余,用于向后兼容,在使用时非常不赞成。