-Woverloaded-virtual с оператором мелкого копирования по умолчанию ⇐ C++
-
Anonymous
-Woverloaded-virtual с оператором мелкого копирования по умолчанию
Это предупреждение выдается компилятором G++, начиная с GCC-13.
[*]
Clang++ 17 доволен этим кодом.
[*]
MSCV 19 выдает аналогичное предупреждение
(39): предупреждение C4263: 'Derived &Derived::operator =(const Derived &)': функция-член не переопределяет какую-либо функцию виртуального члена базового класса (46): предупреждение C4264: 'const Parent &Parent::operator =(int &)': для виртуальной функции-члена из базового 'Parent' недоступно переопределение; функция скрыта (10): примечание: см. объявление «Parent::operator =» (5): примечание: см. декларацию «Родителя». Почему мне нужно реализовать оператор присваивания в производном классе, а не наследовать от родительского класса?
Скрытие оператора тоже не помогает.
На мой взгляд, это выглядит как недостаток стандарта C++.
#include использование пространства имен std; структура Родитель { Родитель() = по умолчанию; виртуальный ~Parent() = по умолчанию; виртуальный константный родитель и оператор = (int &x) { х = 0; вернуть *это; } }; Производное структуры: публичный родительский элемент { Производное() = по умолчанию; виртуальный ~Derived() = по умолчанию; #если правда) /* Установите значение false, чтобы избавиться от следующего предупреждения g++ -o Woverloaded-virtual-test -Wall -Wextra Woverloaded-virtual-test.cpp или clang++ -o Woverloaded-virtual-test -Wall -Wextra Woverloaded-virtual-test.cpp main.cpp:18:28: предупреждение: «virtual const Parent& Parent::operator=(int&)» скрыто [-Woverloaded-virtual=] 18 | виртуальный константный родитель и оператор = (int &x) | ^~~~~~~~ main.cpp:48:24: примечание: by ‘constexpr Derived& Derived::operator=(const Derived&)’ 48 | constexpr Derived& оператор=(const Derived&) = delete; | ^~~~~~~~ */ #еще виртуальный константный родитель и оператор = (int &x) { вернуть Parent::operator=(x); } #endif constexpr Derived& оператор=(const Derived&) = delete; недействительный метод (int &x) { х *= 2; возвращаться; } }; интервал основной() { cout
Это предупреждение выдается компилятором G++, начиная с GCC-13.
[*]
Clang++ 17 доволен этим кодом.
[*]
MSCV 19 выдает аналогичное предупреждение
(39): предупреждение C4263: 'Derived &Derived::operator =(const Derived &)': функция-член не переопределяет какую-либо функцию виртуального члена базового класса (46): предупреждение C4264: 'const Parent &Parent::operator =(int &)': для виртуальной функции-члена из базового 'Parent' недоступно переопределение; функция скрыта (10): примечание: см. объявление «Parent::operator =» (5): примечание: см. декларацию «Родителя». Почему мне нужно реализовать оператор присваивания в производном классе, а не наследовать от родительского класса?
Скрытие оператора тоже не помогает.
На мой взгляд, это выглядит как недостаток стандарта C++.
#include использование пространства имен std; структура Родитель { Родитель() = по умолчанию; виртуальный ~Parent() = по умолчанию; виртуальный константный родитель и оператор = (int &x) { х = 0; вернуть *это; } }; Производное структуры: публичный родительский элемент { Производное() = по умолчанию; виртуальный ~Derived() = по умолчанию; #если правда) /* Установите значение false, чтобы избавиться от следующего предупреждения g++ -o Woverloaded-virtual-test -Wall -Wextra Woverloaded-virtual-test.cpp или clang++ -o Woverloaded-virtual-test -Wall -Wextra Woverloaded-virtual-test.cpp main.cpp:18:28: предупреждение: «virtual const Parent& Parent::operator=(int&)» скрыто [-Woverloaded-virtual=] 18 | виртуальный константный родитель и оператор = (int &x) | ^~~~~~~~ main.cpp:48:24: примечание: by ‘constexpr Derived& Derived::operator=(const Derived&)’ 48 | constexpr Derived& оператор=(const Derived&) = delete; | ^~~~~~~~ */ #еще виртуальный константный родитель и оператор = (int &x) { вернуть Parent::operator=(x); } #endif constexpr Derived& оператор=(const Derived&) = delete; недействительный метод (int &x) { х *= 2; возвращаться; } }; интервал основной() { cout
Мобильная версия