2015-03-10 3 views
0

Я пытаюсь выяснить, как получить доступ к родительскому методу с помощью указателя на дочерний класс. Есть идеи? Я искал примеры, но нашел вещи, которые были более разными, чем нет. child access parent - different.с использованием auto/указатель на дочерний элемент, дочерний родительский метод

У меня есть тестовый класс со следующим:

auto canvasObj = parseCanvas(one, two); 
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working 
//I also tried l_three = canvasObj->getThree(); (doesn't work) 

где:

class CanvasObject final : public ParentOfCanvas 
{....} 

и:

class ParentOfCanvas : public AnotherObject 
{ 
public: 
    Three getThree(); 
     ... 
} 
+2

Что означает «не работает»? Не компилируется? –

+0

Компилятор говорит, что у AnotherObject нет члена getThree(); Это использование canvasObj-> getThree(); – Michele

+1

Вопрос, на который вы ссылаетесь, обратный круг. –

ответ

-1

я ликвидируется делать это, и это работает:

base_static_cast<AnotherObject, Three>(canvasObject)->getThree(); 

коррекции. При дальнейшем тестировании я должен был сделать это:

static_cast (canvasobject.get()) -> getThree();

Он пытался получить информацию из-за неправильного места.

+0

Вам действительно нужно исправить свой дизайн, если ваши базовые классы должны ссылаться на методы на производных классах. Однако, если вы застряли в плохом дизайне, вы должны использовать динамический бросок, чтобы сделать ваш downcasting, а не статический приведение, и всегда проверяйте возвращаемое значение, поскольку неудачные downcasts возвращают нулевой указатель, поэтому не разгладьте его. https://msdn.microsoft.com/en-us/library/cby9kycs.aspx – LawfulEvil

3

Похоже, что вы пытаетесь получить доступ к методам базового класса/данные из экземпляра производного класса.

Вместо:

auto canvasObj = parseCanvas(one, two); 
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working 

Использование:

auto canvasObj = parseCanvas(one, two); 
Three l_three = canvasObj.getThree(); // or maybe canvasObj->getThree() 

Причина твоя не работает в том, что это, своего рода, неправильно введенную месиво пытается получить доступ к «статическим» член вместо одного в конкретном экземпляре. В моем решении я получаю доступ к данным 'getThree' на объекте canvas, который вы создали из возврата parseCanvas.

В противном случае, если мое решение не работает, возможно, parseCanvas возвращает неправильный тип данных. То есть, я ожидаю, что он вернет CanvasObject, но вы не предоставили подпись этому методу. Вам может потребоваться бросить или заменить авто с точным типом, который вы хотите, чтобы он был (CanvasObject *). Его posisble, что parseCanvas может возвращать тип const, и getThree не помечен как const, так что вам будет сложно его вызвать.

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

EDIT:

на основе ваших комментариев, объект холст возвращается еще указатель базового класса, и вы пытаетесь вызвать метод производного класса. Это невозможно. Вам нужно настроить метод parseCanvas для возврата указателя производного класса или вам нужно (VERY BAD IDEA) передать указатель из базового класса в производный (если вы действительно знаете, что это действительно тот тип).

1

Вы должны использовать переменную-то объект, как:

Three l_three = canvasObj->getThree(); 
+0

canvasObj в этом случае unique_ptr , который понятия не имеет, что такое getThree. –

Смежные вопросы