考虑这个代码示例:
#include <iostream>
using namespace std;
class Base
{
private:
int number;
public:
Base():number(10){}
~Base(){}
virtual void print()
{
cout << "Base class" << endl;
}
};
class Derived : public Base
{
public:
Derived():Base(){}
~Derived(){}
void print(int value)
{
//printing number in Base class and paramter value
cout << "Derived with value " << value << " number is" << number << endl;
}
};
我想使用多态并调用过载的print()
函数
所以使用这些类如下:
void somewhere_else()
{
Base* polymorphism = new Derived();
polymorphism->print(5); //Error indicating there are too many parameter
//thinking that I am trying to use print in Base class
((Derived*)polymorphism)->print(5)
//This works as I am casting the variable as Derived variable
}
不幸的是,我无法从基类指针调用print()(编译错误,请参阅上面的注释)。我只能用演员来称呼它。 是否有更好的方法来保持多态性并仍然基于派生类调用重载函数?
答案 0 :(得分:1)
在您的代码中,您有两个不同的成员函数,它们具有不同的签名:
print()
。它在Base
中声明和定义,并在Derived
print()
,它带有一个int
参数。它仅为Derived
因此基础对象不知道带有int参数的打印函数。这就是你需要施放的原因(顺便提一下,如果你需要它就会响起警报铃声)。
如何改进?
首先,如果您想在派生类中覆盖虚拟函数,请使用关键字override
:
class Derived : public Base
{
public:
Derived():Base(){}
~Derived(){}
void print(int value) override
{
...
}
};
这将确保在函数签名中出现细微不匹配的情况下出现错误消息:
prog.cpp:23:10: error: ‘void Derived::print(int)’ marked ‘override’, but does not override
void print(int value) override
^~~~~
然后确保签名在基类和派生类中对齐(即两者都采用int参数或非参数。
请注意,您无法在派生类中访问基类的private
成员。您必须将number
定义为protected
才能在Derived
中打印出来。
最后,如果你有一个具有虚拟成员的基类,那么系统地使析构函数成为虚拟是一种合理的做法。这将避免更复杂的类的微妙错误:
class Base
{
protected:
int number;
public:
Base():number(10){}
virtual ~Base(){}
virtual void print(int value)
{
...
}
};
这里是online demo
现在事情正在发挥作用,这是一篇简短的文章,内容是difference between overload and override。