2013-03-13 6 views
5

Użyłem VisualAssistX Implement Virtual Methods opcję i generowane:Jakakolwiek różnica między "wirtualną pustką IBase :: Foo" i "wirtualną pustką Foo"?

class Base: public IBase 
{ 
public: 
    Base(void); 
    ~Base(void); 
    virtual void IBase::Foo(); 

Zauważyłem, że mogę pominąć IBase i program nadal kompiluje tak:

virtual void Foo(); 

Jeśli jest to ten sam kod? Dlaczego VisualAssistX wstawia IBase::? Czy jest to po prostu rodzaj "stylu kodu", który poprawia czytelność?

Dzięki

+3

Myślę, że wstawienie nazwy przestrzeni/nazwy klasy * wewnątrz * deklaracji klasy ** zmniejsza ** czytelność. Nazwa funkcji bare jest w porządku. –

+3

Czy to jest nawet poprawne C++? – NPE

+0

@ RichardJ.RossIII: Nie mogę tego skompilować za pomocą 'g ++ 4.7.2':' error: nie można zadeklarować funkcji składowej 'B1 :: foo' wewnątrz 'D'' – NPE

Odpowiedz

2

Pomogłoby to w rozwiązaniu niejasności, gdybyś wywodził się z wielu klas bazowych ze zderzeniem funkcji wirtualnych. Podejrzewam, że jest to powód, dla którego VisualAssistX decyduje się wstawić IBase::.

To, czy IBase:: pomaga poprawić czytelność, jest dyskusyjne. Osobiście uważam, że to rozprasza.

Co więcej, składnia nie jest nawet standardowym C++. Zapoznaj się z Distinct implementations for pure virtual functions with same name, aby uzyskać dyskusję i sugestię, jak rozwiązać problem wielokrotnego dziedziczenia za pomocą standardowego, przenośnego C++.

+0

Jest to jednak MSVC-C++, który jest prawdopodobnie tylko tym, co jest istotne dla OP. –

1

Zdecydowanie nie poprawia czytelności, na odwrót. Przedrostek zasięgu jest do użytku z zewnątrz lub gdy istnieje niejednoznaczność rozdzielczości, użycie prefiksu wewnątrz samego zakresu powoduje jedynie zaciemnienie kodu i jest w rzeczywistości sprzeczne z zasadami OOP. Kiedy jesteś wewnątrz zakresu, twój podmiot nie musi go ponownie wskazywać, jest całkowicie zbędny. Jeśli chodzi o VA, mogę jedynie spekulować, że było prostsze do wdrożenia.

1

Różnica polega na tym, że pierwsza nie jest poprawna C++.

Być może Twój kompilator to akceptuje (ponieważ ten kompilator ma wiele dziwnych "rozszerzeń" do tego języka); ale jeśli potrzebujesz, aby twój kod był przenośny dla bardziej standardowych kompilatorów, będziesz musiał użyć drugiego formularza.

Why VisualAssistX inserts IBase:: ?

Przypuszczam, że jest to chybiona próba wskazania, że ​​funkcja nadpisuje zgłoszonemu IBase; ale nie mam pojęcia, dlaczego ktoś pomyślał, że to dobry pomysł.

Is it just kind of "code-style" to improve readability?

Wręcz przeciwnie; ta fałszywa deklaracja sprawia, że ​​funkcja wygląda jak członek IBase, kiedy to faktycznie jest członkiem Base. Tego rodzaju zamieszanie zmniejszy czytelność.

Powiązane problemy