C++ cpp多态性和继承-编译器看不到方法

C++ cpp多态性和继承-编译器看不到方法,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我有两门课: template<typename T> class A{ public: T& someMethod(std::string); } template<typename T> class B: public A<T>{ public: T& someMethod(T&,T&); } 因为我的编译器看不到someMethod(std::string)。你知道为什么会这样吗?是的,

我有两门课:

template<typename T>
class A{
    public:
        T& someMethod(std::string);
}

template<typename T>
class B: public A<T>{
public:
    T& someMethod(T&,T&);
}

因为我的编译器看不到
someMethod(std::string)
。你知道为什么会这样吗?

是的,这是名字隐藏。您应该只添加使用声明

template<typename T>
class B: public A<T>{
public:
    using A<T>::someMethod;
    T& someMethod(T&,T&);
};
模板
B类:公共A{
公众:
使用A::someMethod;
T&somethod(T&,T&);
};

是的,这是名字隐藏。您应该只添加使用声明

template<typename T>
class B: public A<T>{
public:
    using A<T>::someMethod;
    T& someMethod(T&,T&);
};
模板
B类:公共A{
公众:
使用A::someMethod;
T&somethod(T&,T&);
};
你知道为什么会这样吗


在作用域中查找名称期间,当作用域具有名称的定义时,对定义的搜索将停止从包含作用域到封闭作用域。类继承被认为是嵌套范围(有一些与当前讨论处理多重继承无关的警告)。因此,当找到someMethod的B定义时,搜索停止,A不被查找。ForEveR允许使用
将A的定义导入B

请注意,搜索算法是一条通用规则,适用于其他类型的嵌套作用域、块(但块的函数声明现在并不常见)和命名空间(请尝试定义重载函数ns1::someFunction和ns2::someFunction,在ns2中,如果不导入其声明,将无法调用ns1::someFunction)

你知道为什么会这样吗


在范围中查找名称期间,当范围具有名称的定义时,对定义的搜索将停止从包含范围到封闭范围。并且类继承被视为嵌套范围(有些注意事项与当前讨论的处理多重继承无关)因此,当找到someMethod的B定义时,搜索将停止,而A不会被查找。ForEveR提供了使用
使用
将A的定义导入B的方法


请注意,搜索算法是一条通用规则,适用于其他类型的嵌套作用域、块(但块的函数声明现在并不常见)和命名空间(请尝试定义重载函数ns1::someFunction和ns2::someFunction,在ns2中,如果不导入其声明,将无法调用ns1::someFunction)。

问题在于派生类中的方法隐藏了具有相同名称的基类的所有方法

要调用基类方法,必须使用限定名

比如说

#include <iostream>
#include <string>

template<typename T>
class A{
    public:
        T& someMethod( std::string s ) 
        { 
            static T t; 
            std::cout << "A::someMethod: " << s << std::endl; 
            return ++t; 
        }
};

template<typename T>
class B: public A<T>{
public:
    T& someMethod(T& t1,T& t2 )
    { 
        static T t; 
        std::cout << "B::someMethod" << std::endl; 
        return t = t1 + t2; 
    }
};

int main()
{
    B<int> b1;
    b1.A::someMethod( "Hi" );
    // ^^^^^^^^^^^^^^
}    

否则,您可以通过使用声明将基类方法的声明包括在派生类的范围内。

问题在于派生类中的方法隐藏了具有相同名称的基类的所有方法

template<typename T>
class B: public A<T>{
public:
    using A<T>::someMethod;
    T& someMethod(T&,T&);
};
要调用基类方法,必须使用限定名

比如说

#include <iostream>
#include <string>

template<typename T>
class A{
    public:
        T& someMethod( std::string s ) 
        { 
            static T t; 
            std::cout << "A::someMethod: " << s << std::endl; 
            return ++t; 
        }
};

template<typename T>
class B: public A<T>{
public:
    T& someMethod(T& t1,T& t2 )
    { 
        static T t; 
        std::cout << "B::someMethod" << std::endl; 
        return t = t1 + t2; 
    }
};

int main()
{
    B<int> b1;
    b1.A::someMethod( "Hi" );
    // ^^^^^^^^^^^^^^
}    

否则,您可以通过using声明将基类方法的声明包含在派生类的作用域中。

重复的我想添加的是B;B.someMethod(“HelloWorld”)请注意,您的代码示例不可由C++编译器编译。在类声明结束时,您忘记了<代码>;(<代码>类…{…};<代码> >)。显示您没有使用多态性,只有继承在所提供的示例中没有多态性。请注意,您的代码示例不是由C++编译器编译的。在类声明结束时,您忘记了<代码>; >(<代码>类…{…};< /C> >)。
template<typename T>
class B: public A<T>{
public:
    using A<T>::someMethod;
    T& someMethod(T&,T&);
};