"virtual A* someMethod"与"virtual class A* someMethod"

"virtual A* someMethod" vs "virtual class A* someMethod"

本文关键字:someMethod virtual class      更新时间:2023-10-16

我一直在尝试理解一段代码,它是这样的:

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

我似乎无法理解someMethodsomeOtherMethod之间的区别(或者如果存在的话)——两者似乎都是虚拟方法,并且都在继承自B.的类中被重写

有人能解释一下这个虚拟类语法吗?

A类名class A精化类型说明符。如果没有其他称为A的类,那么两者都引用了名为A的类。

如果还有其他东西(可能是函数或变量)称为A,那么A的非限定使用将指代它。您需要详细的说明符class A来引用类。如注释中所述,您还可以使用class A,而无需先前声明该类;使用详细的说明符就足以将类名引入最内部的命名空间。

它与虚拟函数语法关系不大;这两种形式都可以用于指定类型,无论是作为函数的返回类型还是在任何其他上下文中。

在C中,您过去必须编写struct S才能引用结构。事实上,有这样的模式来处理它:typedef S struct {},它创建了一个未命名的结构,然后通过类型别名将其命名为S。

C++保留了这一功能,但会自动对原始类型进行别名。在您的案例中,A是正式名称class A的类型别名。当然,如果您有多个A,那么自动别名将不起作用,但这也是一个相当大的代码气味。

TL;DR:两个函数返回的内容相同。它是C的残余,用于向后兼容性,使用时极不受欢迎。