为什么重载的继承静态函数含糊不清?

时间:2013-09-18 09:55:04

标签: c++ inheritance static-methods

这就是我所尝试的(函数“fun”必须是静态的):

#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; 

所以我的问题是:如果我可以覆盖member functions,而不是静态函数,那怎么用C ++?为什么在这种情况下不会超载?我希望编译器将“fun”带入命名空间C ::然后进行名称修改并使用重载来区分C :: fun(int)和C :: fun(double)。

3 个答案:

答案 0 :(得分:3)

您需要自己将它们纳入范围:

class C
:
    public A,
    public B
{
public:
    using A::fun;
    using B::fun;
};

答案 1 :(得分:1)

您需要的是class C的定义:

public:
    using A::fun;
    using B::fun;

答案 2 :(得分:1)

目前尚不清楚要调用哪种fun()方法,因此您必须指定所需的方法:

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

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

   return 0;
}