предупреждение: смещение для нестандартного типа макета DerivedClass - PullRequest
0 голосов
/ 19 декабря 2018

Мне нужно избавиться от этого предупреждения.Насколько я понимаю, это происходит потому, что DerivedClass не рассматривается как простые старые данные.Я прочитал cppreference о POD и Стандартный тип макета , но я все еще не понимаю, почему DerivedClass не является POD.Если я помещаю члены BaseClass в DerivedClass и не использую наследование - тогда все в порядке.Я использую C ++ 11

Вот пример:

#include <iostream>

using namespace std;

class BaseClass
{
public:
    int a;
};

class DerivedClass : public BaseClass
{
public:
    int b;
};

int main(int argc, char *argv[])
{
    // warning: offset of on non-standard-layout type 'DerivedClass'
    int offset = offsetof(DerivedClass, b);

    cout << offset;
}

Я ценю любую помощь.

1 Ответ

0 голосов
/ 19 декабря 2018

Это требования для стандартного типа макета:

Все нестатические элементы данных имеют одинаковое управление доступом

Не имеет виртуальных функций или виртуальных базовых классов

Не имеет нестатических элементов данных ссылочного типа

Все нестатические члены данных и базовые классы сами являются стандартными типами макетов

До C ++ 14:

Либо

не имеет базовых классов с нестатическими элементами данных, либо

не имеет нестатических элементов данных в наиболее производном классе и не более одного базового класса снестатические члены данных

не имеет базовых классов того же типа, что и первый нестатический элемент данных (см. пустую базовую оптимизацию)

Эта часть относится к этому примеру:

has no base classes with non-static data members,

В вашем случае у вас есть базовый класс с нестатическими членами данных.Удаление a удаляет предупреждение.

После C ++ 14 существуют аналогичные ограничения, вы не можете иметь членов в двух классах, только один:

Имеет все нечлены статических данных и битовые поля, объявленные в одном классе (либо все в производном, либо все в некоторой базе)

...