2017-08-29 38 views
3

有沒有辦法根據其他調用來替換可能的基類的多個函數的「堆棧繼承」類型?來自多個類的C++多態性

例如像:

class Base { 
     void func1(){/* do something */} 
     void func2(){/* do something */} 
}; 
class A1 { 
     void func1(){/* do something else */} 
}; 
class A2 { 
     void func2(){/* do something else */} 
}; 

int main(){ 
    A1 a1obj = new A1(); 
    A2 a2obj = new A2(); 
    Base obj = new Base(); 

    obj = &a1obj; 
    obj = &a2obj; 
    obj.func1(); //now A1::func1() 
    obj.func2(); //now A2::func2() 
} 

謝謝

+0

打開你的C++的書,介紹瞭如何使用'章std :: function',並讀取它。 –

+0

是的,但是你的函數需要是虛擬的,你需要從基類派生出來,如果你使用多態的基類型來工作,你需要使用指針或引用。 –

+0

這可能會通過閱讀一些好的初學者書籍來解答(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

回答

1

有虛函數和多重繼承在C++(這應儘量避免)。

什麼,你可以在這種情況下,做的是:

class Base { 
     virtual void func1(){/* do something */} 
     virtual void func2(){/* do something */} 
}; 
class A1: public Base { 
     void func1() override {/* do something else */} 
}; 
class A2: public A1 { 
     void func2() override {/* do something else */} 
}; 

int main(){ 
    A2 a2obj; 
    Base* obj = &a2obj; 

    obj->func1(); //now A1::func1() 
    obj->func2(); //now A2::func2() 
} 

你甚至可以跳過實例的基礎對象,只是做

int main(){ 
    A2 obj; 

    obj.func1(); //now A1::func1() 
    obj.func2(); //now A2::func2() 
} 
+2

它不只是*可以跳過*,它*必須跳過*。否則在你的例子中'Base'就會泄露。 – spectras