我们可以通过const函数实现多态吗?

时间:2013-07-11 18:51:11

标签: c++ polymorphism

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

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

4 个答案:

答案 0 :(得分:4)

答案是。你可以超负荷!!

#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 fun()'在const对象上调用,'void fun()'在非const对象上调用。 C ++允许在const类型的基础上重载成员方法。当函数返回引用或指针时,基于const类型的重载可能很有用。我们可以创建一个函数const,它返回一个const引用或const指针,其他非const函数,返回非const引用或指针。

答案 1 :(得分:2)

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

您可能会因重写而使重载感到困惑。

函数重载是两个具有相同名称但签名不同的函数。您发布的代码就是一个例子。构成签名的函数部分包括参数列表和方法的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();
}

即使指针是指向Foo的指针,程序也会输出“BAR”。


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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

因为我们能够调用那些函数,一个( const函数)具有常量对象和 另一个(非常数函数)与非常数对象。这两个函数具有相同的名称但它们具有不同的用法和多态性也指相同的名称但不同的形式