2010-11-28 90 views
0

所以有像3個功能中包含相同的名稱:С++我們可以創建類函數的覆蓋嗎?

bool VideoEncoder::AddFrame(AVFrame* frame, const char* soundBuffer, int soundBufferSize) 
bool VideoEncoder::AddFrame(const char* soundBuffer, int soundBufferSize) 
bool VideoEncoder::AddFrame(AVFrame* frame) 

可以嗎?

+0

這不是最重要的。這就是所謂的超載。 – Chubsdad 2010-11-28 15:13:39

回答

1

不僅是可能的,而且它是C++的一個非常有用的功能,稱爲函數重載。

還要注意,誰共享同一名稱的功能必須比他們唯一的返回類型更加不同,但它們可以在其常量性僅不同(這是非常頻繁的和有用的):

struct A 
{ 
    void doSomething()  { std::cout << "A" << std::endl; } 
    void doSomething() const { std::cout << "B" << std::endl; } 

    // int doSomething(); /* illegal : differs only by return type */ 
    double doSomething(int); /* OK : differs by return type and parameters */ 
}; 

int main() 
{ 
    A a; 
    const A constA; 

    a.doSomething();  // prints "A" 
    constA.doSomething(); // prints "B" 
} 
3

絕對如此。 C++中的函數通過名稱和參數(但不是它們的返回值)進行區分。所以對於編譯器來說,這些只是不同的功能(或方法)。

但是當參數不同時,它被稱爲'重載',而不是'重寫'。後者是當你在一個子類中具有同名參數的函數時。

4

是的,它被稱爲函數重載,並且是C++的標準功能。

函數必須根據傳遞給它們的參數的數量和類型來解析。例如,如果你定義了以下過載,這將會中斷:

void A::foo(long n); 
void A::foo(double n); 

A a; 
int i = 42; 
a.foo(i); 

這會產生無法解決的模糊性。

1

是的,這是正確的。重載函數必須具有相同的名稱,返回類型和不同的參數集。