2015-06-24 2 views
2

У меня есть этот простой класс (Alpha) и его абстрактный класс (бета). Я не могу передать объекты Alpha (Beta) для функции overwrite(), потому что абстрактный класс не может обрабатывать объекты типа self.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 аннотация и не могут быть созданы.

Ваша подпись функции требует создания абстрактного класса.

Try проходя по ссылке или указателю:

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

Я сделал это, и это показало другую ошибку: Невозможно объявить переменную «А» абстрактной типа «Альфа», потому что следующие «виртуальные» функции чисты в «Альфе»: 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):

A: 8 
B: 6 

A: 6 

Обратите внимание, что я добавил ключевое слово override после объявления функции в Alpha , Если бы вы сделали это, в то время как аргумент все еще был Alpha, ваш код не был бы скомпилирован по этой причине.

+0

Это хороший ответ, но в моем случае класс Alpha не следует трогать, особенно в случае упоминания абстрактного класса внутри него. Если бы это можно было решить, только касаясь абстрактного класса (бета), это было бы очень здорово. – AndroidGuy

+0

Тогда вы SOL. Если вы не можете изменить подпись 'overwrite' в производном классе, чтобы соответствовать ** чистой виртуальной функции ** в вашем базовом классе, то вы не можете скомпилировать какой-либо из ваших производных классов. – CoryKramer

Смежные вопросы