2015-03-17 2 views
0

Я пытался понять кусок кода, который идет как это:«виртуальный A * SomeMethod» против «класса А виртуальной * SomeMethod»

class A { 
    // some class definition 
} 

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

Я не могу понять разницу (или, если таковая существует, по этому вопросу) между someMethod и someOtherMethod - как представляется, виртуальные методы и оба переопределен в классах, которые наследуются от B.

Может кто-нибудь пролить некоторый свет на этот виртуальный синтаксис класса?

ответ

5

A этого имя класса и class A является уточненного спецификатора типа. Если ничего не называется A, то оба относятся к классу A.

Если бы было что-то еще (функция или переменная, возможно), называемая A, то безоговорочное использование A будет ссылаться на это. Для обращения к классу вам понадобится разработанный спецификатор class A. Как упоминалось в комментариях, вы также можете использовать class A без предыдущего объявления класса; использование разработанного спецификатора достаточно, чтобы ввести имя класса в самое внутреннее пространство имен.

Это не имеет никакого отношения к синтаксису виртуальных функций; обе формы могут использоваться для указания типа, будь то тип возврата функции или в любом другом контексте.

+2

Кроме того, если ранее не было декларации 'A', специфицированный спецификатор типа вводит имя' A' в самую внутреннюю охватывающую область пространства имен декларации. – 0x499602D2

+0

Означает ли это, что someOtherMethod, по сути, будет работать как какое-то форвардное объявление для A (если A было определено после B)? – fstanis

+2

@fstanis Да, но не 'someMethod', если' A' ранее не было объявлено в этой точке программы. – 0x499602D2

1

В C вы имели обыкновение писать struct S, чтобы обратиться к структуре. Фактически, этот шаблон имел дело с этим: typedef S struct {}, который создает неназванную структуру, затем дает ему имя S на основе псевдонимов.

C++ сохранил эту способность, но псевдонимы необработанных типов автоматически. В вашем случае A является псевдонимом типа с официальным именем class A. Конечно, автоматический псевдоним не будет работать, если у вас более одного A, но это также довольно большой запах кода.

TL; DR: обе функции возвращают то же самое. Это остатки C для обратной совместимости и чрезвычайно нахмурились при использовании.

+1

Почему прошлое? Сменил ли С? –

+0

Ну нет, C++ изменил необходимость в этом. Я думаю об этом как о улучшении. – Blindy

Смежные вопросы