В более эффективном C++ интересным моментом является то, что смешивание массива и полиморфизм - плохая идея. Для например:Предупреждение компилятора для смешанного массива и полиморфизма
class Base {
public:
Base(int y) : a(y) {}
int a;
};
class D : public Base {
public:
D(int w, int y) : Base(y), c(w) {}
int c;
};
std::ostream& operator<<(std::ostream& os, const Base &obj)
{
os << obj.a << std::endl;
return os;
}
// This function will work perfectly well if i pass in a `Base` array,
// but if i pass in `D` array we are going to run into some problems.
// Namely that `arr[i+1] = &arr[i] + sizeof(Base)` will not progress
// the array correctly for a `D` array.
void printArray(const Base arr[]) {
for (int i = 0; i < 5; ++i) {
std::cout << arr[i];
}
}
int main() {
D arr[5] = { D(0, 10), D(1, 11), D(2, 12), D(3, 13), D(4, 14)};
printArray(arr); // This compiles without complaint! I understand that the
// conversion is legal, but it seems like a warning
// about this would be a good idea.
}
Примечание: Я знаю, что это плохой дизайн, но, чтобы проиллюстрировать свою точку зрения.
Проблема заключается в том, что при смешивании этих двух способов, которые у меня выше, когда мы итерируем массив для печати, мы не будем продвигать элемент массива на правильную сумму (т.е. мы перемещаем на sizeof(Base)
вместо sizeof(D)
). Это приводит к выходу:
10
0
11
1
12
(И я предполагаю, что вызов operator<<
, как это, вероятно, UB).
При компиляции с g++ -std=c++1y -Wall -Weffc++ -pedantic main.cpp
У меня нет никаких предупреждений или ошибок.
- Есть ли флаг компилятора, который я могу включить, который указывает предупреждение в этом сценарии?
- Если нет, то почему бы и нет?
Ну, ответ на вопрос «2» означает, что «предупреждения» не являются обязательными для реализации компилятором. Вы можете попросить разработчиков g ++ добавить такое предупреждение (если оно еще не существует), но они не вынуждены делать это по любому стандарту. – PaulMcKenzie
@PaulMcKenzie, правда, но GCC идет выше и дальше с их предупреждениями, мне интересно, есть ли техническая трудность в обнаружении этого? –
Вы должны спросить инженеров, которые собрали компилятор. Там ответ может быть где угодно: «это хорошая идея», чтобы «у нас нет времени», «он уже существует». – PaulMcKenzie