C ++ - “不能将参数'匿名'声明为抽象类型”

时间:2015-06-24 19:18:51

标签: c++ class inheritance abstract

我有这个简单的类(Alpha)和他的抽象类(Beta)。我无法将Alpha(Beta)对象传递给overwrite()函数,因为抽象类无法处理自我类型对象。

#include <iostream>
using std::cout;
using std::endl;
using std::ostream;

class Beta {
    public:
        virtual int  read() const = 0;
        virtual void write(int) = 0;
        virtual void overwrite(Beta) = 0; // <-- This is the problem
};

class Alpha : public Beta {
    public:
        int  read     () const;
        void write    (int);
        void overwrite(Alpha);
    private:
        int value;
};

int Alpha::read() const {
    return value;
}
void Alpha::write(int v) {
    value = v;
}
void Alpha::overwrite(Alpha A) {
    value = A.value;
}

int main () {
    Alpha A, B;
    A.write(8);
    B.write(6);

    cout << "A: " << A.read() << endl; // 8
    cout << "B: " << B.read() << endl; // 6

    A.overwrite(B);

    cout << endl << "A: " << A.read(); // 6
    return 0;
}

它给了我[Error] cannot declare parameter '<anonymous>' to be of abstract type 'Beta'。怎么处理呢?这是一个小代码示例,但我需要解决这个问题,因为我不能重载运算符并正确地声明这种类型的函数。

2 个答案:

答案 0 :(得分:3)

Beta类是抽象的,无法实例化。

您的函数签名需要实例化抽象类。

尝试通过引用或指针传递:

void overwrite(Beta& b);
void overwrite(Beta * b);

答案 1 :(得分:1)

问题是您的overwrite方法是纯虚拟的,不会被覆盖。此方法在Beta

中具有以下签名
virtual void overwrite(Beta) = 0;

Alpha

void overwrite(Alpha);

这些不是相同的功能签名。你可以做的是传递一个引用并投射它,例如

class Beta {
    public:
        virtual int  read() const = 0;
        virtual void write(int) = 0;
        virtual void overwrite(Beta&) = 0;
};

class Alpha : public Beta {
    public:
        int  read     () const;
        void write    (int);
        void overwrite(Beta&) override;  // Note the override
    private:
        int value;
};

void Alpha::overwrite(Beta& A){
    value = static_cast<Alpha&>(A).value;
}

这将产生输出(live demo):

A: 8
B: 6

A: 6 

请注意,我在override中的函数声明后添加了关键字Alpha。如果您在参数仍为Alpha时执行此操作,则由于此原因,您的代码将无法编译。