Справка по наследованию методов C ++ - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть класс Graphic, который обрабатывает рисование Item, и поэтому все мои классы Item унаследуют его.

По сути, у меня есть метод Graphic::Draw(type argX, type argY),это требует, чтобы argX и argY были переданы ему методом Item.

Так что я мог бы легко иметь метод Item::DrawMe(), подобный этому:

class Graphic {
    ...
    void Draw(type argX, type argY)
    {
        // drawing code
    }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    void DrawMe() : Draw(this->mX, this->mY) { }
    ...
};

Но я бы предпочел вместо этого метод Item::DrawMe() с именем Item::Draw().Однако тогда метод Item::Draw() будет иметь то же имя, что и метод Graphic::Draw.Но я не могу использовать базовый метод virtual, потому что я не хочу явно переписывать тело функции ...

Так как мне это сделать?Спасибо.

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Вы можете просто ограничить вызов дочернего элемента Draw для вызова Graphic :: Draw (тип, тип) явно ..Например:

class Graphic {
    ...
    virtual void Draw(type argX, type argY)
    {
        // drawing code
    }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    virtual void Draw() { Graphic::Draw( this->mX, this->mY ); }
    ...
};

Но следите за Item :: Draw (void) shadowing (hiding) Item :: Draw (тип, тип) .Вы не увидите обеих перегрузок в дочернем классе (например, Item objects).Вы должны будете использовать явную область видимости ... (Как ItemObject-> Graphic :: Draw (x, y) .) Или, возможно, "using" clause ...

Кроме того, вы сталкиваетесь со сложностями кодирования в отношении полиморфизма ... Приятно ссылаться на набор графических объектов с помощью одного виртуального Draw () метод.Например: пункт I;Графика * g = & i;g-> draw (foo, bar);

Я хотел бы предложить что-то вроде:

class Graphic {
    ...
    virtual void Draw(type argX = LOADDATA, type argY = LOADDATA)
    {
       if ( argX == LOADDATA )  argX = getArgX();
       if ( argY == LOADDATA )  argY = getArgY();

        // drawing code
    }
    virtual type getArgX() { return DEFAULT_ARGX; }
    virtual type getArgY() { return DEFAULT_ARGY; }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    virtual type getArgX() { return mX; }
    virtual type getArgY() { return mY; }
    ...
};

Конечно, вам лучше перенести введите mX и введите mY в базовый класс, чтобы начать с ... Предположительно, большинство Графика объекты будут иметь местоположение x, y ...

0 голосов
/ 18 декабря 2010

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

...