2011-02-03 217 views
2
class A 
{ 
A() {}; 
virtual ~A() {}; 
virtual void Start() {}; 
virtual void Start(float a) {}; 
}; 

class B : public A 
{ }; 

class C : public A 
{ 
virtual void Start(float a) {}; 
} 


... 
B BObj; 
BObj.Start(); // -> fine, no complain from g++ 
... 

... 
C CObj; 
CObj.Start(); // -> not fine -> error: no matching function for call to ‘C::Start()’ 
... 

我懷疑問題來自兩個虛擬函數具有相同的名稱,但具有不同的參數簽名。我想知道的是,這是一個特定於g ++的錯誤消息,它是如何實現vtable的,還是基於C++標準的錯誤。具有相同名稱的虛擬成員函數的繼承

+2

有上面的東西缺少;類例程默認情況下都是私有的,所以上面寫的代碼會發出與您發佈的代碼不同的錯誤... – fbrereto 2011-02-03 20:17:29

+0

As @fbrereto指出您的方法的可見性僅限於A類,也不是C繼承它們。 – josefx 2011-02-03 20:21:04

回答

0

C中Start的重載隱藏了A中所有重載的Start版本。如果您沒有嘗試重載A中的Start [即Start0(),Start1(float)]你不會看到這個問題。

5

超載功能隱藏所有其他Start功能。要使用它們添加using A::Start

class C : public A 
{ 
public: 
using A::Start; 
virtual void Start(float a) {}; 
} 

另外,還要Start公衆,並且要了。

編輯:Here你可以找到爲什麼派生類隱藏基類函數。

0

您試圖撥Start()CObj。但是沒有這樣的功能,因爲定義的唯一功能是過載Start(float a),其中參數爲float

正如編譯器所說。

如果一個Start()函數在C類中被定義爲deflared,則調用此函數應該沒問題。它可以被聲明爲虛擬的而不是被定義/實現的。

希望這會有所幫助。

0
class A 
{ 
public: 
    A() {} 
    virtual ~A() {} 

    virtual void Start() {} 
    virtual void Start(float a) {} 
}; 

class B : public A 
{ 
}; 

class C : public A 
{ 
public: 
    using A::Start; 
    virtual void Start(float a) {} 
}; 

int main() 
{ 
    B BObj; 
    BObj.Start(); 

    C CObj; 
    CObj.Start(); 
} 
0

,當你在另一個類重載函數,永遠調用重載函數 如果否則你調用它。 例如

class A() 
{ 
    void start(); 

}; 
class B:public A 
{ 
    void start(); 
    void Start();{A::start}//this function call it's father function 
} 
void main() 
{ 
    A a; 
    B b; 
    a.start();//call own function,start() in A. 
    b.start();//call is own function,start() in B. 
    b.Start();//call start() in A. 
}