2015-06-24 84 views
2

我有这个简单的类(Alpha)和他的抽象类(Beta)。我无法将Alpha(Beta)对象传递给overwrite()函数,因为抽象类不能处理自我类型对象。C++ - “不能声明参数'匿名'为抽象类型'

#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'。如何处理它?这是一个小代码示例,但我需要解决这个问题,因为我不能重载运算符并正确声明这种类型的函数。

回答

3

Beta类是抽象的,不能实例化。

你的函数签名需要一个抽象类的实例化。

尝试通过以引用或指针:

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

我做到了,它显示了一个不同的错误: 无法将变量'A'声明为抽象类型'Alpha',因为以下虚拟函数在'Alpha'中是纯的:virtual void Beta :: overwrite(Beta& – AndroidGuy

+0

@AndroidGuy如果你没有改变'Alpha :: overwrite'的签名,那么我就告诉你会发生什么。 – CoryKramer

+0

对不起,我没有得到它。 – AndroidGuy

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):我在Alpha添加关键字override在函数声明之后

A: 8 
B: 6 

A: 6 

注。如果你在参数仍然是Alpha时这样做了,那么你的代码就不会因为这个原因而编译。

+0

这是一个很好的答案,但在我的情况下,不应该触及Alpha类,特别是在提及其内部的抽象类的情况下。如果仅通过触及抽象类(Beta)就可以解决问题,这将非常棒。 – AndroidGuy

+0

然后你是SOL。如果您无法在派生类中更改“overwrite”的签名以匹配基类中的**纯虚函数**,则无法编译任何派生类。 – CoryKramer