2016-12-10 13 views
0

私のコードに問題があります。C++抽象親クラスで子メソッドを呼び出す方法は?

class A{ 
    virtual foo()=0; 
} 

class B: public A { 
    foo(); 
    foo2(); 
    operator X(A * a) {a->foo2()} //doesn't work 
} 

class C: public A { 
    foo(); 
    foo2(); 
    operator X(A * a) {a->foo2()} //doesn't work. 
} 

私は仮想クラスとそれを継承する2つのクラスを持っています。そして、Aオブジェクトに作用する演算子Xを、BまたはCのいずれであっても定義する必要があります(Aは抽象であるため、Aではありません)。問題は、オペレータがfoo2()を呼び出すことです。クラスAで書き込むことはできません。どうすればよいですか?

ありがとうございました。これは私の最初の投稿です。

+1

オペレータの署名を 'X(B * a)'に変更してください。 –

+0

'foo2()はクラスAの一部ではないからです。 –

+0

私は変更できませんオペレータ署名。私はオペレータXの仕事をB、Cのいずれにしても持っていなければなりません。私はAとしてしか見ません。 – Student000

答えて

1

right回答は、foo2という純粋な仮想をAで宣言することです。しかし、これは許可されていないと言われています。 。

あなたの唯一の残りのオプションはdynamic_castを使用することです:-(ブー

void do_foo2(A* a) 
{ 
    if (B* b = dynamic_cast<B*>(b)) 
     return b->foo2(); 
    C& c = dynamic_cast<C&>(*a); // Will throw if a is not B or C. 
    return c.foo2(); 
} 

その後

void B::operator X(A* a) 
{ 
    do_foo2(a); 
} 

注:このすべては、あなたがBとCの両方でB::operator X仕事をすることになっていると仮定

+0

はい、これはとても意味があります!ありがとう、私はちょうどこれ一日を過ごした:-) – Student000

関連する問題