我有一个接口,我正在尝试动态多态的示例如下:
#include <iostream>
using namespace std;
class foo{
public:
virtual void set();
virtual void printValue();
};
class fooInt : public foo{
private:
int i;
public:
int get(){
return i;
}
void set(int val){ //override the set
i = val;
}
void printValue(){
cout << i << endl;
}
};
int main(){
foo *dt; //Create a base class pointer
dt = new fooInt; //Assign a sub class reference
dt->set(9);
}
然而,当我编译它时,我没有调用'foo :: set(int)'的匹配函数。我哪里错了?我试着阅读this文章,但我仍然无法弄清楚错误。
答案 0 :(得分:1)
class foo
没有方法set(int)
。它有一个方法set()
,但没有方法set(int)
。
如果要覆盖继承的方法,则超类方法和方法必须具有相同的签名:
class foo {
...
// If you really want an abstract class, the `= 0`
// ensures no instances can be created (makes it "pure virtual")
virtual void set(int) = 0;
...
}
答案 1 :(得分:1)
这是因为你的定义
virtual void set();
应该是
virtual void set(int val);
答案 2 :(得分:1)
此处给出了更正的程序
#include <iostream>
using namespace std;
class foo {
public:
virtual void set(int val)=0;////////here you have void set() function with no argument but you tried to override void set(int val) which take one argument.
virtual void printValue()=0;
};
class fooInt : public foo{
private:
int i;
public:
fooInt()
{
cout<<"constructor called\n";
}
int get(){
return i;
}
void set(int val){ //override the set
i = val;
}
void printValue(){
cout << i << endl;
}
};
int main(){
foo *dt; //Create a base class pointer
dt=new fooInt;
dt->set(9);
dt->printValue();
}
上一个程序的错误是
1.您尝试使用set(int val){one argument}覆盖set(){no argument}。 2.当一个类包含纯虚函数时,它必须由其派生类实现。 3.不能创建包含纯虚函数的类的对象。但是可以创建ref。 谢谢