我们可以通过 const 函数实现多态性吗?我的意思是一个函数 a() 和另一个函数 a()const 的行为是多态的吗?
void func(int a){}
void func(int a)const {}
我们可以通过 const 函数实现多态性吗?我的意思是一个函数 a() 和另一个函数 a()const 的行为是多态的吗?
void func(int a){}
void func(int a)const {}
答案是。你可以超载它!
#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 引用或指针。
这不是多态性。这是函数重载。
您可能会将重载与覆盖混淆。
函数重载是两个名称相同但签名不同的函数。您发布的代码是一个示例。构成签名的函数部分包括参数列表和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
.
*“相同的签名”:实际上,协变签名。
正如@chris 解释的那样,“不,它们必须具有相同的签名”。
是的,我们可以实现多态行为。
因为我们可以调用这些函数,一个(const 函数)带有常量对象,另一个(非常量函数)带有非常量对象。这两个函数名称相同,但用法不同,多态性也指名称相同但形式不同。