2013-11-14 73 views
-1

派生類這是我的問題:訪問具有基類對象

class A { 
public: 
    int foo; 
    void setFoo(val) { foo = val; } 
}; 

class B1 : public A { 
public: 
    void foo(); 
} 

class B2 : public A { 
public: 
    void bar(); 
} 

int main() 
{ 
    A obj; 
    switch(t) // some menu 
    { 
    case '1': 
     obj.setFoo(something); 
    case '2': 
     obj.foo(); 
    case '3': 
     obj.bar(); 
    } 

    return 0; 
} 

交換機是在一個while循環 - 這是某種形式的菜單。第一例首先運行。

問題是情況2和3.obj是基類的實例,所以我無法訪問這些方法。

我該如何解決這個問題?

爲兩個派生類創建兩個不同的對象不起作用,因爲我必須在它們兩個上使用setFoo()方法,而且它不會再是相同的屬性。

+1

你覺得'obj.foo()'會做什麼,即使它編譯了。 'obj'的類型是'A',所以它不能是B1或B2,並且沒有繼承要完成。你能更清楚'obj'究竟是什麼嗎?也許你實際上有'A * obj ='? –

+1

在base中聲明所有這些方法爲虛擬的,並且使'obj'成爲'A *'而不是對象,因爲如果將派生類對象分配給基類,則將切片派生類屬性。 – theAlias

+0

除了已經說過的之外,類B1甚至不是有效的,因爲它使用已經用於其基類中的屬性的函數的名稱。 – jPlatte

回答

3

您應該在基類中將此函數聲明爲虛函數,或者在lwast聲明它們在基類中。