2017-12-24 7 views
0

コンパイラが続ける'class A' has no member named 'foo'. ポインタを持つ派生クラスの関数を使用しようとしています。ここに私のコードは次のとおりです。基本クラスからのポインタを持つC++アクセス派生クラス

class A{ 
    ..... 
}; 

class B:public A{ 
    virtual void foo() = 0; 
}; 

class C:public B{ 
.... 
public: 
    void foo(){ 
     .... 
    } 
}; 

私はTableという名前Aポインタのテーブルを持っていると

Table[j]->foo() 

をしようとしたとき、私は、コンパイラのエラーを取得しています。

キャスト以外はどうすればよいですか?

+2

がA' 'への純粋仮想関数を移動して印刷しないだろうか?これは実際に多態的に使用しようとするタイプです。 – StoryTeller

+0

クラス 'A'は' foo() 'という名前のメンバ関数を持っていないので。 –

+0

私はクラスBにfoo()関数を持たせたくない – Jokk

答えて

2

Aクラスで関数fooが宣言されていないため、コンパイルエラーが発生しました。

次のようなAで純粋仮想として宣言することができます:派生クラスで

class A { 
    virtual void foo() = 0; 
}; 

をあなたに明示的virtualfooを宣言する必要はありません。 Cのみが具象クラスの場合は、fooをクラスBに宣言する必要はありません。

あなたの例であれば、あなたはポインタのあなたの配列にAあなたはクラスCのインスタンスのみを持っているあなたは、明示的にCへのポインタにキャストすることができますが、それが悪いデザインの兆候であると私はそれをお勧めしませんしことがわかっている場合:

static_cast<C*>(Table[j])->foo() 
0

あなたはどちらか、それをベースにポインタを持っているし、あなたが派生型へのポインタを持っているので、キャストする必要が派生型のメンバにアクセスしたい場合や、あなたの場合のようにすると、仮想としてfoo()を追加メンバーを基地に連れて行く。

class A 
{ ... }; 
class B : public A:{ 
{ 
public: 
    virtual foo() { std::cout << "B::foo" << std::endl; } 
}; 
class C : public B 
{ 
public: 
    void foo() { std::cout << "C::foo" << std::endl; 
}; 
... 
A * arr[8]; 
for(int i = 0; 8>i; ++i) 
    arr[i] = new C; 
((B*)arr[0])->foo(); // will print "C::foo\n" 

しかし、あなたはAvirtual void foo() = 0;を追加した場合、あなただけのarr[0]->foo()、それはまだC::foo

+2

"Aaarrrrrggghhh"そのCスタイルのキャストで。ここで 'static_cast'や' dynamic_cast'を使わない理由はありません。 – Quentin

関連する問題