- В C++ 11
override
specifier защищает от переопределения предполагаемой функции виртуальной базы (поскольку подписи не совпадают). final
specifier защищает от непреднамеренного переопределения функции в производном классе.
=> Есть спецификатор (что-то вроде, может быть first
или no_override
), которая защищает от переопределения неизвестной базовой функции?Какова противоположность спецификатора C++ `override` /` final`?
Я хотел бы получить ошибку компилятора, когда виртуальная функция была добавлена в базовый класс с той же сигнатурой, что и уже существующая виртуальная функция в производном классе.
EDIT 4: Для того, чтобы сохранить этот вопрос прост и ответы уместно, здесь снова
оригинальный псевдокод
- аннотация
class B : A
имеетprivate: virtual void fooHasBeenDone() = 0;
class C : B
инвентарьprivate: virtual void fooHasBeenDone() override { react(); }
- Теперь
class A
получает новыйprivate: virtual void fooHasBeenDone();
- Но новый
A::foo
может быть что-то другое, чем оригинальныйB::foo
.
и конкретный пример
- аннотация
class B : A
имеетvirtual void showPath() = 0;
meaing в PainterPath class C : B
реализуетvirtual void showPath() override { mPath.setVisible(); }
- Теперь
class A
получает новыйvirtual void showPath();
означает путь к файлу - Теперь, когда A вызывает showPath(), B показывает PainterPath вместо некоторого пути к файлу.
Конечно, это не так, и я должен переименовать B::showPath()
в B::showPainterPath()
и осуществлять B::showPath() override
, а также. Я просто хотел бы получить информацию от компилятора.
Вот компиляции реальный пример:
#include <iostream>
#define A_WITH_SHOWPATH
class A
{
#ifdef A_WITH_SHOWPATH
public:
void setPath(std::string const &filepath) {
std::cout << "File path set to '" << filepath << "'. Display it:\n";
showPath();
}
// to be called from outside, supposed to display file path
virtual void showPath() {
std::cout << "Displaying not implemented.\n";
}
#else
// has no showPath() function
#endif
};
class B : public A
{
public:
virtual void showPath() = 0; // to be called from outside
};
class C1 : public B {
public:
virtual void showPath() override {
std::cout << "C1 showing painter path as graphic\n";
}
};
class C2 : public B {
public:
virtual void showPath() override {
std::cout << "C2 showing painter path as widget\n";
}
};
int main() {
B* b1 = new C1();
B* b2 = new C2();
std::cout << "Should say 'C1 showing painter path as graphic':\n";
b1->showPath();
std::cout << "---------------------------\n";
std::cout << "Should say 'C2 showing painter path as widget':\n";
b2->showPath();
std::cout << "---------------------------\n";
#ifdef A_WITH_SHOWPATH
std::cout << "Should give compiler warning\n or say \"File path set to 'Test'. Display it:\"\n and \"Displaying not implemented.\",\n but not \"C1 showing painter path as graphic\":\n";
b1->setPath("Test");
std::cout << "# Calling setPath(\"Test\") on a B pointer now also displays the\n# PainterPath, which is not the intended behavior.\n";
std::cout << "# The setPath() function in B should be marked to never override\n# any function from the base class.\n";
std::cout << "---------------------------\n";
#endif
return 0;
}
запустить его и посмотреть на вывод текста.
Для справки, старший пример с конкретной потребительной случае (PainterPath экземпляра):
https://ideone.com/6q0cPD (ссылка может быть истек)
Возможно, опция '-Wsuggest-override' GCC может помочь, см. Https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html – gavv
@gavv Вот что я ищу. Существует ли независимый от платформы способ? Мне тоже это нужно в VS2012. –
ИМХО это вопрос о дизайне. Как упоминала Батшеба, это невозможно, за исключением использования окончательного в базовом классе. Или вы можете использовать трюк, о котором упоминал Леон, который нарушает цель класса интерфейса ([см. Здесь] (http://coliru.stacked-crooked.com/a/17346a88fa6aaa89)) и содержит некоторые другие проблемы. Как вы упомянули в своем последнем правлении, вы просто не должны называть функции одинаковыми с разными значениями. если вы хотите получить информацию об использовании некоторых инструментов анализа (также упоминается в «Bathsheba imho» только правильный ответ). (IMHO) – user1810087