2016-10-17 2 views
0

Представьте, что у меня есть суперкласс A на C++, который имеет виртуальный метод. Если я хочу переопределить его в своем классе B и все еще держать его в виртуальном режиме, рекомендуется сохранить ключевое слово virtual в классе B, могу ли я его игнорировать, потому что я уже сказал, что метод виртуальный в суперклассе?Метод виртуального класса C++

Например, что является правильным способом сделать следующее.

Метод A:

class A{ 
    public: 
     virtual void hello(){ 
      std::cout << "Hello World!" << std::endl; 
     }; 
}; 
class B: public A{ 
    public: 
     virtual void hello() override{ 
      std::cout << "Hello Sun!" << std::endl; 
     }; 

}; 
class C: public B{ 
    public: 
     virtual void hello() override{ 
      std::cout << "Hello Moon!" << std::endl; 
     }; 

}; 

Или объявить функцию как виртуальная только на первом классе.

Метод B:

class A{ 
    public: 
     virtual void hello(){ 
      std::cout << "Hello World!" << std::endl; 
     }; 
}; 
class B: public A{ 
    public: 
     void hello() override{ 
      std::cout << "Hello Sun!" << std::endl; 
     }; 

}; 
class C: public B{ 
    public: 
     void hello() override{ 
      std::cout << "Hello Moon!" << std::endl; 
     }; 

}; 

Я хочу использовать поздно выжидать во всех ситуациях. Поэтому мне нужно, чтобы метод hello() был виртуальным в трех классах. Оба способа работали над CodeBlocks, но я не знаю, что является лучшим способом или даже если между ними есть разница.

+2

Вам не нужно сохранять ключевое слово 'virtual'. Что не так с вашим кодом? –

+0

@ πάνταῥεῖ Привет за ваш ответ. Мой код работает отлично, я просто не знал, что было лучшим способом его реализовать (A или B). Теперь я знаю, что мне не нужно сохранять виртуальное ключевое слово –

ответ

4

virtual является излишним для B и C, и эффект точно такой же. Важно всегда отмечать ваши методы override , если они предназначены для переопределения виртуального метода. Хотя это не является строго необходимым, это хорошая практика. Вы делаете это правильно в обоих примерах.

standardese Соответствующая:

n4140

§ 10.3 [class.virtual]/2

Если виртуальная функция-член vf объявляется в классе Base и в класса Derived, полученных прямо или косвенно от Base, a функция-член vf с таким же именем, тип-список параметров, резюме-квалификация и refqualifier (или отсутствие же), как Base::vf объявляются, то Derived::vf также виртуальное (ли она или нет так объявлен) и она перекрывает Base::vf.


override как спецификатор доступен, так как C++ 11.

+1

['переопределить'] (http://en.cppreference.com/w/cpp/language/override) спецификатор, введенный в C++ 11, так что это не всегда можно использовать его. – Nikita

+0

@ Никита * смотрит на календарь *. Гм. Ред. – krzaq

+1

Тонны кода C++ все еще используют старые компиляторы, и в большинстве случаев обновление невозможно. – Nikita

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