"virtual A* someMethod"与"virtual class A* someMethod"
"virtual A* someMethod" vs "virtual class A* someMethod"
我一直在尝试理解一段代码,它是这样的:
class A {
// some class definition
}
class B {
public:
virtual A *someMethod();
virtual class A *someOtherMethod();
}
我似乎无法理解someMethod
和someOtherMethod
之间的区别(或者如果存在的话)——两者似乎都是虚拟方法,并且都在继承自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的残余,用于向后兼容性,使用时极不受欢迎。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 在基类中调用的 VIrtual 基函数,C++
- C++类:virtual和override,或者两者都没有
- g++ [[noreturn]] on a virtual method
- "virtual"对C++析构函数有何影响?
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 错误"pure virtual method called",当此方法已被覆盖时
- 为什么C++尝试/捕获没有捕获"pure virtual call"异常?
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- Protobuf 生成的C++类无法针对 iOS 进行编译,并显示错误"Only virtual member functions can be marked 'final'"
- 为什么必须将"virtual"放入基类中,而不是仅在子类中使用"override"?在C++
- 使用 -march 编译会导致线程说"pure virtual method called"
- "Prototype pattern"和"Virtual constructor"是相同的模式吗?
- 为什么Virtual继承2类会增加对象大小
- 在C 11或更高版本中,是否可以通过Lambda来实现单方法纯Virtual C 接口
- C++ "virtual"关键字放置
- 在C++中声明一个类"final : public virtual"有用吗?
- C++ "Pure Virtual Function Being Called"失败
- "virtual A* someMethod"与"virtual class A* someMethod"