пересылка с наследованием информации - PullRequest
6 голосов
/ 16 января 2011

Компилируется нормально, хотя я бы не хотел пока запускать его.Однако ...

//class base;
//class derived;
//class derived : public base;

class base {};
class derived : public base {};

class other
{
    public:
        void func() {base1 = derived1;}
        base* base1;
        derived* derived1;
};

void main()
{
}

... перемещение класса other выше определения base и производного, для которого есть аналогичная вещь, которую я должен сделать в программе myne, вызывает ошибки компиляции.

Очевидное решение состоит в том, чтобы переслать объявление base и производного, показанного закомментированным вверху кода, однако это приводит к невозможности преобразования между base * и производной * ошибкой.Попытка переслать объявлять, включая информацию о наследовании, также не работает.

Ответы [ 2 ]

9 голосов
/ 16 января 2011

Это должно работать.Вам нужно сдвинуть другие вверх

НО, объявите func ниже.Таким образом, func может «видеть», что производная имеет тип base.

например,

class base;
class derived;
//class derived : public base;

class other
{
    public:
        void func();
        base* base1;
        derived* derived1;
};

class base {};
class derived : public base {};

void other::func() { base1 = derived1; }
4 голосов
/ 16 января 2011

Нет синтаксиса для прямого объявления двух классов и указания того, что один наследуется от другого. Это связано с тем, что наследование может быть сложным (множественным и / или виртуальным), поэтому присваивание base1 = derived1 может включать некоторую арифметику, и компилятору трудно / невозможно сгенерировать эту арифметику, когда он знает только, что derived наследуется от base.

Итак, чтобы решить вашу проблему, вы можете сделать func не встроенным (см. Ответ от AbstractDissonance ), или, если вам абсолютно необходимо, чтобы оно было встроенным, используйте reinterpret_cast:

class base;
class derived;

class other
{
    public:
        void func() {base1 = reinterpret_cast<base*>(derived1);}
        base* base1;
        derived* derived1;
};

Это плохо, поскольку не гарантируется, что он будет работать по стандарту C ++, и почти наверняка не будет работать, если вы используете множественное / виртуальное наследование. Используйте это только в том случае, если func должен быть максимально быстрым (т.е. inline ), и если вам не нужен ваш код для переносимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...