2012-07-10 9 views
10

は、以下のコードはエラーを生成します。C++抽象クラス・パラメータのエラーの回避策

#include <iostream> 

using namespace std; 

class A 
{ 

public: 

    virtual void print() = 0; 
}; 

void test(A x) // ERROR: Abstract class cannot be a parameter type 
{ 
    cout << "Hello" << endl; 
} 

は、このエラーの解決策/回避策は

virtual void print() = { } 

virtual void print() = 0; 

を交換するよりも良い/他あり

EDIT:基本クラスAを拡張/実装する任意のクラスをパラメータとして渡すことができるようにするには、ポリモーフA* x = new B() ; test(x);

乾杯もちろん

+0

定義によるAbstarctクラスは、すべてそれ自身でインスタンス化するべきではありません。派生クラスによってメソッドをオーバーライドする必要があります。ただ好奇心が強い、これを行うことで何を達成しようとしていますか? – Mahesh

+1

私はA x = new B()のようなことをして、Aを拡張/実装するクラスを渡したいと思います。 – Cemre

+1

解決策を見つける前に、問題を理解する必要があります。抽象クラスを「値による」パラメータとして渡すという考え方はまったく意味がありません。あなたは何をしようとしているのですか? – AnT

答えて

20

抽象クラスをインスタンス化できないため、値を渡すことはほとんど間違いです。あなたは、ポインタまたは参照で、それを渡す必要があります。

void test(A& x) ... 

または

void test(A* x) ... 

ほぼ予期しない(悪い方法で)影響を持つことが保証されていると、object slicingになります値で渡すので、コンパイラはそれをエラーとしてフラグを立てます。

+1

私はそれが確かに保証されていると思います。 –

+0

@LuchianGrigoreスライスはスライスされることになります。これは、vtableが基本クラスのものにスライスされるためです。 – dasblinkenlight

3

、署名を変更します。

void test(A& x) 
//or 
void test(const A& x) 
//or 
void test(A* x) 

タイプAの目的は、論理的に意味がありませんので、ご使用のバージョンが動作しない理由はあります。抽象です。実際に型がパラメータとして渡されたAではなく、A(派生コンクリートクラス)の実装クラスであるため、参照またはポインタを渡すとこれが回避されます。