1

これは私が試したものです(関数「楽しい」は静的でなければなりません):

#include<iostream>

class A
{
    public:
        static void fun(double x) { std::cout << "double" << std::endl; }
};

class B
{
    public: 
        static void fun(int y) { std::cout << "int" << std::endl; }
};

class C
:
    public A,
    public B
{
};

int main(int argc, const char *argv[])
{
    double x = 1; 
    int y = 1; 

    C::fun(x); 
    C::fun(y); 

    return 0;
}

g++ (GCC) 4.8.1 20130725 (プレリリース) を使用すると、次のエラーが発生しました。

main.cpp: In function 'int main(int, const char**)':
main.cpp:27:5: error: reference to 'fun' is ambiguous
     C::fun(x); 
     ^
main.cpp:12:21: note: candidates are: static void B::fun(int)
         static void fun(int y) { std::cout << "int" << std::endl; }
                     ^
main.cpp:6:21: note:                 static void A::fun(double)
         static void fun(double x) { std::cout << "double" << std::endl; 

だから私の質問は:静的関数ではなくメンバー関数をオーバーライドできる場合、C++ にどのように来るのですか? このシナリオで過負荷が機能しないのはなぜですか? コンパイラが名前空間 C:: に「楽しみ」を持ち込んでから、名前マングリングを実行し、オーバーロードを使用して C::fun(int) と C::fun(double) を区別することを期待します。

4

3 に答える 3

4

それらを自分でスコープに入れる必要があります。

class C
:
    public A,
    public B
{
public:
    using A::fun;
    using B::fun;
};
于 2013-09-18T10:00:58.113 に答える
1

どのメソッドを呼び出したいか明確ではないfun()ため、必要なメソッドを指定する必要があります。

int main(int argc, const char *argv[])
{
   double x = 1; 
   int y = 1; 

   A::fun(x); 
   B::fun(y); 

   return 0;
}
于 2013-09-18T10:20:54.777 に答える