c++ - 函数重载、继承和隐式构造函数 : weird priority

标签 c++ inheritance constructor c++11 overloading

这是一个测试代码:

#include <iostream>
#define OPTION 1

template<typename T>
class Base
{
    public:
        Base() : _x() 
        {std::cout<<"Base()"<<std::endl;}

        Base(const T& source) : _x(source) 
        {std::cout<<"Base(const T& source)"<<std::endl;}

        Base(const Base<T>& source) : _x(source.x) 
        {std::cout<<"Base(const Base<T>& source)"<<std::endl;}

    public:
        inline void set(const T& source) 
        {std::cout<<"Base::set(const T& source)"<<std::endl; 
        this->_x = source;}

        inline T get() const 
        {std::cout<<"Base::get(const T& source)"<<std::endl; return _x;}

    protected:
        T _x;
};

template<typename T>
class Derived : public Base<T>
{
    public:
        Derived() : Base<T>() 
        {std::cout<<"Derived()"<<std::endl;}

        Derived(const T& source) : Base<T>(source) 
        {std::cout<<"Derived(const T& source)"<<std::endl;}

        Derived(const Derived<T>& source) : Base<T>(source) 
        {std::cout<<"Derived(const Derived<T>& source)"<<std::endl;}

    public:
        #if OPTION == 0
        inline void set(const T& source) 
        {std::cout<<"Derived::set(const T& source)"<<std::endl; 
        this->_x = source;}
        #endif

        inline void set(const Base<T>& source) 
        {std::cout<<"Derived::set(const Base<T>& source)"<<std::endl; 
        this->_x = source.get();}
};

int main(int argc, char* argv[])
{
    Derived<double> d;
    double x = 4.5;
    d.set(x);
    return 0;
}

对我来说OPTION 0OPTION 1将是等效的,但它们不是,我想了解原因。

OPTION 0 , 当main电话 d.set(x)编译器可以在 Derived<T>::set(const T& source) 之间进行选择和 Derived<T>::set(const Base<T>& source)当然,对于 T x他选择Derived<T>::set(const T& source) .

现在 OPTION 1 , 当main电话 d.set(x) ,我认为编译器可以在 Base<T>::set(const T& source) 之间进行选择和 Derived<T>::set(const Base<T>& source) .

但不是选择Base<T>::set(const T& source) ,编译器(此处为 GCC 4.6.3)隐式转换 xBase<T>并调用 Derived<T>::set(const Base<T>& source) .

这正常吗?

为了拥有 OPTION 0 避免这种情况(不更改构造函数)的常用技术(如果存在)是什么?和 OPTION 1等效?

最佳答案

当在派生类中从基类重载函数时,基类函数是隐藏的,并且永远不会被重载决议选择,除非 using使用声明。也就是说,允许编译器选择 Base<T>::set(const T&) , 你添加了

using Base<T>::set;

在您的派生类中。

关于c++ - 函数重载、继承和隐式构造函数 : weird priority,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785275/

相关文章:

javascript - JavaScript 对象构造函数的问题,其中参数是其他对象

c++ - 数据未从 tempArray[] 正确存储到 realArray[][]

c++ - 使用指向基类的指针作为数组参数

c#对象在当前上下文中不存在

javascript - 将 .apply() 与 'new' 运算符一起使用。这可能吗?

java - 接口(interface)和继承编译时错误

c++ - 2009 年的 OpenGL 窗口库

c++ - 用字符串中的修改版本替换字符

c++ - 字符串是动态分配的吗?

inheritance - 是否可以将 Swift 泛型类函数返回类型限制为同一个类或子类?