2011-02-03 11 views
2
class A 
{ 
A() {}; 
virtual ~A() {}; 
virtual void Start() {}; 
virtual void Start(float a) {}; 
}; 

class B : public A 
{ }; 

class C : public A 
{ 
virtual void Start(float a) {}; 
} 


... 
B BObj; 
BObj.Start(); // -> fine, no complain from g++ 
... 

... 
C CObj; 
CObj.Start(); // -> not fine -> error: no matching function for call to ‘C::Start()’ 
... 

私は、両方の仮想関数が同じ名前だがパラメータの署名が異なるということから問題が発生していると考えます。私が知りたいのは、これはg ++固有のエラーメッセージ、vtableの実装方法、またはC++標準に基づくエラーです。同じ名前の仮想メンバ関数の継承

+2

上記に何かがあります。クラスルーチンはすべてデフォルトでプライベートなので、あなたが上に書いたコードはあなたが投稿しているものとは異なるエラーを出します... – fbrereto

+0

@fbreretoは、あなたのメソッドの可視性がクラスAにもBにも限定されていると指摘していますCもそれらを継承しません。 – josefx

+0

著者はちょうどすぐにいくつかのコードを一緒に投げたと思います。現在の場所に...コンパイラエラーが発生する –

答えて

0

Cでの起動のオーバーロードは、Aからのすべてのオーバーロードされた開始バージョンを非表示にします。 Start0()、Start1(float)]この問題は表示されません。

5

オーバーロード機能は、他のすべてのStart機能を隠します。彼らはusing A::Startを追加使用するには:

class C : public A 
{ 
public: 
using A::Start; 
virtual void Start(float a) {}; 
} 

することは、あまりにもでStart公衆を作ります。

編集:Hereなぜ、派生クラスが基底クラス関数を隠すのかがわかります。

+0

クール、作品!ありがとう、kecsap – kecsap

+0

しかし、このデザインの理由/根拠は何ですか?ありがとう、kecsap – kecsap

+0

@kecsap編集を参照してください – UmmaGumma

0

CObjStart()に電話をかけようとしています。しかし、定義された唯一の関数がfloatパラメータを取るオーバーロードされたStart(float a)であるため、そのような関数はありません。

コンパイラの説明どおりです。

Start()クラスの関数がCクラスで宣言されている場合、この関数を呼び出すのは問題ありません。これは、仮想として宣言することも、定義したり実装したりすることもできません。

これが役に立ちます。

0
class A 
{ 
public: 
    A() {} 
    virtual ~A() {} 

    virtual void Start() {} 
    virtual void Start(float a) {} 
}; 

class B : public A 
{ 
}; 

class C : public A 
{ 
public: 
    using A::Start; 
    virtual void Start(float a) {} 
}; 

int main() 
{ 
    B BObj; 
    BObj.Start(); 

    C CObj; 
    CObj.Start(); 
} 
0

あなたは、あなたがそれを呼び出す他にあれば、これまでオーバーロードされた関数 を呼び出すために、別のクラス内の関数をオーバーロード。 たとえば、

class A() 
{ 
    void start(); 

}; 
class B:public A 
{ 
    void start(); 
    void Start();{A::start}//this function call it's father function 
} 
void main() 
{ 
    A a; 
    B b; 
    a.start();//call own function,start() in A. 
    b.start();//call is own function,start() in B. 
    b.Start();//call start() in A. 
}