2013-03-09 70 views
1

我想創建一個模板類與多個孩子重寫模板的方法(我相信我做到了這一點)。然後我想要一個可以與所有孩子一起工作的單一功能。使用繼承的通用函數

例如:

#include <iostream> 
using namespace std; 

class base{ 
public: 
    virtual void print(void){ 
     cout << "Base" << endl; 
    } 
}; 

class inherit_a : public base{ 
public: 
    virtual void print(void) override{ 
     cout << "inherit_a" << endl; 
    } 
}; 

class inherit_b : public base{ 
public: 
    virtual void print(void){ 
     cout << "inherit_b" << endl; 
    } 
}; 

void print_function(base item){ 
    item.print(); 
} 


int main(){ 
    inherit_a item_a; 
    print_function(item_a); 
    return(0); 
} 

這版畫「基地」像我所期望的,但我想它使用inherit_a的印刷方法或inherit_b的印刷方法,如果inherit_b就算爲print_function。是這樣的可能嗎?

回答

4

你在找什麼叫做亞型多態性;在C++中,只有引用類型允許多態性virtual函數調用按預期工作。你可以使用一個參考:

或指針:

void print_function(base* item){ 
    item->print(); 
} 

你所做的價值把對象,複製對象的base部分只,這就是所謂的切片

void print_function(base item){ 
    item.print(); 
} 

注意,因爲你的print() MEM ber函數不修改對象,它可以並應該被聲明爲const。另外,參數列表中的(void)是C風格,在C++中是冗餘的;改爲使用()

virtual void print() const { 
    cout << "Base" << endl; 
} 

const是簽名的一部分,這樣子類還必須指定它:

virtual void print() const override { 
    cout << "inherit_a" << endl; 
} 

然後print_function()可以採取任一給const對象的引用:

void print_function(const base& item){ 
    item.print(); 
} 

或者一個指向const對象的指針:

void print_function(const base* item){ 
    item->print(); 
} 

這個文檔print_function()也不會修改它的參數。

+0

非常感謝您,感謝您對const的附加信息。我能夠讓一切工作。 – user2150521 2013-03-09 02:14:45

1

這裏的問題是,您正在採取base值到print_function。即使通過inherit_a實例,它也會導致創建一個新對象,該對象的類型爲base(稱爲對象切片)。在點print_function運行它不再是一個inherit_a值,因此不會調用派生的方法。

你要找的是base參考,以防止切片並允許值保持其原有的類型

void print_function(base& item){ 
    item.print(); 
}