2015-08-05 2 views
1

Я пытался сделать пример кода для преобразования типов между объектами, только после того, что показано here.Оператор литья типа не называется

Это родительский класс

// ParentClass.h 
class ParentClass { 
public: 
    ParentClass(); 
    virtual ~ParentClass(); 
}; 

подмигнули лишь некоторые концепции доказательства, единственное, что он делает что-то печать

#include <iostream> 
#include "ParentClass.h" 
ParentClass::ParentClass() 
{ 
    std::cout << "Parent\tDefault constructor\n"; 
} 
ParentClass::~ParentClass() 
{ 
    std::cout << "Parent\tDestructor\n"; 
} 

И затем, производный класс

// ChildClass.h 
#include "ParentClass.h" 

class ChildClass: public ParentClass { 
public: 
    ChildClass(); 
    // conversion constructor 
    ChildClass(const ParentClass& p); 
    // conversion from assignment 
    ChildClass& operator= (const ParentClass & p); 
    // type-cast operator 
    operator ParentClass(); 
    // destructor 
    virtual ~ChildClass(); 
}; 

А затем, код, также довольно глупый

// ChildClass.cpp 

#include <iostream> 
#include "ChildClass.h" 

ChildClass::ChildClass() 
{ 
    std::cout << "Child\tDefault constructor\n"; 
} 
ChildClass::~ChildClass() 
{ 
    std::cout << "Child\tDestructor\n"; 
} 
// conversion constructor 
ChildClass::ChildClass(const ParentClass& p) 
{ 
    std::cout << "Child\tConversion constructor\n"; 
} 
// assignment operator  
ChildClass& ChildClass::operator= (const ParentClass & p) 
{ 
    std::cout << "Child\toperator= conversion\n"; 
    return *this; 
}  
// type-cast operator 
ChildClass::operator ParentClass() 
{ 
    std::cout << "Child\toperatorParentClass()\n"; 
    return ParentClass(); 
} 

Затем я сделать некоторые преобразования в моей основной функции

std::cout << "calls Parent default constructor\n"; 
    ParentClass foo; 
    std::cout << "calls Parent to child constructor\n"; 
    ChildClass bar = foo; 
    std::cout << "calls assignment operator from child\n"; 
    bar = foo; 
    std::cout << "calls Child type-cast operator\n"; 
    foo = bar; 
    std::cout << "Exit\n"; 

Но когда я запускаю этот код не вводя оператор приведения типа из производного класса, он просто печатает это:

calls Parent default constructor 
Parent Default constructor 
calls Parent to child constructor 
Parent Default constructor 
Child Conversion constructor 
calls assignment operator from child 
Child operator= conversion 
calls Child type-cast operator 
Exit 
Child Destructor 
Parent Destructor 
Parent Destructor 

Я затрудняюсь по этому поводу, так как я пробовал код в приведенной выше ссылке, и он работал так, как должен.

ответ

4

Преобразование из исходных данных никогда не вызывает функцию преобразования. [Class.conv.fct]/р1:

Функция преобразования никогда не используется для преобразования (возможно резюме квалифицированного) объекта (возможно, CV-квалифицированного) одного типа объекта (или ссылки на его), к базовому классу (возможно, cv-qualit) , который имеет тип (или ссылку на него) или, возможно, с квалификацией cv void.

В вашем foo = bar;, то bar непосредственно связывается с параметром неявно объявленным оператора присваивания от копирования ParentClassconst ParentClass&.

+0

О, да, я вижу, я добавил это наследование, которое не было на исходном коде. Я просматривал оба кода для различий и всегда упускал из виду, что: / –

 Смежные вопросы

  • Нет связанных вопросов^_^