1

我们可以通过 const 函数实现多态性吗?我的意思是一个函数 a() 和另一个函数 a()const 的行为是多态的吗?

void func(int a){}
void func(int a)const {}
4

4 回答 4

6

答案是。你可以超载它!

#include<iostream>
using namespace std;

class Test
{
protected:
    int x;
public:
    Test (int i):x(i) { }
    void fun() const
    {
        cout << "fun() const called " << endl;
    }
    void fun()
    {
        cout << "fun() called " << endl;
    }
};

int main()
{
    Test t1 (10);
    const Test t2 (20);
    t1.fun();
    t2.fun();
    return 0;
}

输出:上述程序编译并运行良好,并产生以下输出。

fun() called
fun() const called

'void fun() const' 和 'void fun()' 这两种方法具有相同的签名,除了一个是 const 而另一个不是。此外,如果我们仔细查看输出,我们会发现,在 const 对象上调用了“const void fun()”,在非常量对象上调用了“void fun()”。C++ 允许在 const 类型的基础上重载成员方法。当函数返回引用或指针时,基于 const 类型的重载可能很有用。我们可以让一个函数为 const,返回一个 const 引用或 const 指针,另一个非 const 函数,返回非 const 引用或指针。

于 2013-07-11T19:04:19.730 回答
3

这不是多态性。这是函数重载。

您可能会将重载覆盖混淆。

函数重载是两个名称相同但签名不同的函数。您发布的代码是一个示例。构成签名的函数部分包括参数列表和const方法的限定。值得注意的是,函数的返回类型不是函数签名的一部分。

函数覆盖是使用关键字创建的virtual。具有相同的名称和相同的*签名。覆盖背后的基本思想是,如果您只有指向基类的指针,则能够调用派生类的特殊函数。这是一个例子:

class Foo
{
public: 
  virtual std::string GetIt() const { return "FOO" }
};

class Bar : public Foo
{
public:
  std::string GetIt() const { return "BAR"; }
};

int main()
{
  Foo* that = new Bar;
  cout << that->GetIt();
}

程序将输出“BAR”,即使指针是指向Foo.


*“相同的签名”:实际上,协变签名。

于 2013-07-11T19:03:06.593 回答
1

正如@chris 解释的那样,“不,它们必须具有相同的签名”。

于 2013-07-11T19:00:01.397 回答
0

是的,我们可以实现多态行为

因为我们可以调用这些函数,一个(const 函数)带有常量对象,另一个(非常量函数)带有非常量对象。这两个函数名称相同,但用法不同,多态性也指名称相同但形式不同

于 2013-07-11T19:47:08.947 回答