C++ &引用;虚拟A*someMethod“;vs";虚拟A类*someMethod“;

C++ &引用;虚拟A*someMethod“;vs";虚拟A类*someMethod“;,c++,polymorphism,C++,Polymorphism,我一直在试图理解一段代码,它是这样的: class A { // some class definition } class B { public: virtual A *someMethod(); virtual class A *someOtherMethod(); } 我似乎无法理解someMethod和someOtherMethod之间的区别(或者如果存在任何区别的话)——两者似乎都是虚拟方法,并且都在继承自B的类中被重写 有人能解释一

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

class A {
    // some class definition
}

class B {
    public:
        virtual A *someMethod();
        virtual class A *someOtherMethod();
}
我似乎无法理解
someMethod
someOtherMethod
之间的区别(或者如果存在任何区别的话)——两者似乎都是虚拟方法,并且都在继承自B的类中被重写

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

A
是类名,
类A
是详细的类型说明符。 如果没有其他名为
A
,则两者都引用名为
A
的类

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

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

a
是类名,
a
是详细的类型说明符。 如果没有其他名为
A
,则两者都引用名为
A
的类

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


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

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

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


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

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

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


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

此外,如果以前没有
a
的声明,精心设计的类型说明符会将名称
a
引入声明的最内层封闭命名空间范围。这是否意味着其他方法实际上会,作为A的某种正向声明(如果A是在B之后定义的)?@fstanis是,但不是
someMethod
,如果
A
之前在程序中的该点没有声明。另外,如果
A
之前没有声明,精心设计的类型说明符将名称
A
引入声明的最内层封闭命名空间范围。这是否意味着其他方法实际上可以作为A的某种前向声明(如果A是在B之后定义的)?@fstanis Yes,但是如果
someMethod
之前没有在程序中声明
A
,那么就不是了。为什么是过去时?C改变了吗?嗯,C++改变了这个需求。我认为这是一种进步。为什么用过去式?C改变了吗?嗯,C++改变了这个需求。我认为这是一种进步。