는 테스트 코드입니다 :기능 과부하, 상속 및 암시 적 생성자 : 이상한 우선 순위가 여기에
#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 0
를 들어
및 OPTION 1
동등한 것하지만 그들은하지 않습니다 나는 이유를 이해하고 싶습니다. OPTION 0
와
의 main
호출은 컴파일러가 Derived<T>::set(const T& source)
및 Derived<T>::set(const Base<T>& source)
물론, T x
위해 그가 Derived<T>::set(const T& source)
를 선택 사이의 선택의 여지가있다 d.set(x)
때. main
전화 d.set(x)
, 나는 컴파일러가 Base<T>::set(const T& source)
와 Derived<T>::set(const Base<T>& source)
사이의 선택의 여지가 있다고 생각 OPTION 1
와 지금
.
대신 Base<T>::set(const T& source)
을 선택하는 대신 컴파일러 (여기 GCC 4.6.3)는 x
을 암시 적으로 Base<T>
으로 변환하고 Derived<T>::set(const Base<T>& source)
을 호출합니다.
정상입니까?
OPTION 0
과 OPTION 1
을 동등하게하기 위해 (생성자를 변경하지 않고) 일반적인 기술 (있을 경우)이 무엇입니까?
실제로 스트림을 플러시하지 않는다면 [std :: endl' 사용을 중지하십시오] (http://kuhllib.com/2012/01/14/stop-excessive-use-of-stdendl/)해야합니다. –
물론 나는 공연이 필요할 때 std :: endl을 사용하지 않는다. 그러나 여기에는 나의 요점이 아니다. 하지만 당신 말이 맞아요. (그럼에도 불구하고, 로그 파일과 같은 것들에 대해서는 std :: endl이 "\ n"보다 더 편리 할 것입니다.) – Vincent