C ++我们可以创建类函数的覆盖吗?

时间:2010-11-28 14:32:20

标签: c++ oop

要使用3个具有相同名称的函数,例如:

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

我们可以吗?

4 个答案:

答案 0 :(得分:4)

是的,它被称为函数重载,是C ++的标准功能。

必须根据传递给它们的参数的数量和类型来解析这些函数。例如,如果您定义了以下重载,则会中断:

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

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

这会产生无法解决的歧义。

答案 1 :(得分:3)

绝对。 C ++中的函数由它们的名称和参数区分(但不是它们的返回值)。所以对于编译器来说,这些只是不同的函数(或方法)。

但是当论点不同时,它被称为“重载”,而不是“覆盖”。后者是在子类中具有相同名称的参数的函数。

答案 2 :(得分:1)

是的,这是正确的。重载函数必须具有相同的名称,返回类型和不同的参数集。

答案 3 :(得分:1)

不仅可以,而且它是C ++的一个非常有用的功能,称为函数重载。

另请注意,共享相同名称的函数的差异必须大于其唯一的返回类型,但它们的 const-ness 可能不同(这非常频繁且有用):< / p>

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"
}