2011-10-18 136 views
0

重載的方法我有兩個類:繼承,調用從基本方法

class A { 
    int get(); 
    string str(); 
} 

string A::str() { 
    return string_with(get()); 
} 

class B : public A{ 
    int get(); 
} 

如果我這樣做:

A a 
B b 
b.str() 

b將調用A::str()(良好),並將其生病使用A::get()方法(壞了! )。我想,當我調用b.str()時,B::get()str使用。

如何使它工作?

+0

有您發佈的代碼中沒有繼承。 –

+0

-1示例代碼不是真實的。現在的問題是垃圾。不可能說出*意圖*問題是否有意義。 –

+0

增加了繼承,我的錯誤。 @斯坦巴赫:這是有意的問題。 –

回答

3

只是讓它虛擬。這正是虛擬的目的。

virtual int get(); 

在A定義。而且,爲了使代碼更易於理解,請在B中執行相同的操作。

順便說一句,我假設你的意思是寫class B : public A

+2

良好的心理調試技能! –

2

在面向對象編程的神奇的話,有兩種調用方法的方式有兩種:靜態動態調度。

在靜態調度中,當您執行諸如a.do_it()之類的操作時調用的代碼是靜態確定的,也就是說,它是根據變量a的類型確定的。

在動態調度中,所調用的代碼是動態確定的,即它是根據由a所引用的對象的類型確定的。

C++當然支持都是。你如何告訴編譯器你想要哪種類型的調度?簡單:默認情況下你有靜態調度,除非你把virtual放在方法聲明中。

1

您可以使用虛擬關鍵字。然後使用指針

class A 
{ 
public: 
    virtual int get() { cout << "A::get()" << endl; return 0;} 
    string str() 
    { 
     cout << "A::str()" << endl; 
     get(); 
     return ""; 
    } 
}; 

class B : public A 
{ 
public: 
    virtual int get() { cout << "B::get()" << endl; return 0; } 
}; 

B * b = new B; b-> str();

輸出: A :: STR() B ::得到()