首页 > 解决方案 > 请帮我看看为什么我会出错?

问题描述

我无法弄清楚为什么Derived在覆盖 function 之后类仍然是 Abstract fun()

这是错误消息:

error: invalid new-expression of abstract class type 'Derived' Base *t = new Derived(a);
error: no matching function for call to 'Base::fun(int&)'int i = t->fun(b);
#include <iostream>
using namespace std;

class Base
{
protected:
    int s;

public:
    Base(int i = 0) : s(i) {}
    virtual ~Base() {}
    virtual int fun() = 0;
};

class Derived: public Base
{
public:
    Derived(int i) : Base(i) {}
    ~Derived() { cout << --s << " "; }
    int fun(int x) { return s * x; }
};

class Wrapper
{
public:
    void fun(int a, int b)
    {
        Base *t = new Derived(a);
        int i = t->fun(b);
        cout << i << " ";
        delete t;
    }
};

int main()
{
    int i, j;
    cin >> i >> j;
    Wrapper w;
    w.fun(i, j);
    return 0;
}

标签: c++c++11visual-c++

解决方案


该函数在基类和派生类之间有两个不同的签名

virtual int fun() = 0;

但是派生类

int fun(int x) { return s * x; }

如果你要添加override它会提醒你这个错误

int fun(int x) override { return s * x; }

推荐阅读