C ++中的运行时多态性

时间:2013-04-29 00:59:52

标签: runtime polymorphism

我有一个接口,我正在尝试动态多态的示例如下:

#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文章,但我仍然无法弄清楚错误。

3 个答案:

答案 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。 谢谢