我有这个简单的类(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'
。怎么处理呢?这是一个小代码示例,但我需要解决这个问题,因为我不能重载运算符并正确地声明这种类型的函数。
答案 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
时执行此操作,则由于此原因,您的代码将无法编译。