Преобразование типов

Последнее обновление: 03.02.2024

C++

C#

Dart

F#

C++

#include <iostream>
#include <memory>
 
class Person
{
public:
    virtual void print() const 
    {
        std::cout << "Person" << std::endl;
    }
};
class Employee : public Person
{
public:
    void print() const override
    {
        std::cout << "Employee" << std::endl;
    }
};
 
int main()
{
    // автопреобразование из произодного типа в базовый
    Employee tom;
    Person user{tom};
    user.print();

    // преобразование указателей
    // Указатель на производный класс автоматически преобразуется в указатель на базовый тип
    // обратное преобразование из базового в производный не работает
    Employee bob;
    Person* person1{&bob};
    person1->print();
    // обратное статическое преобразование (на этапе компиляции) - с помощью функции static_cast
    Employee* employee1 {static_cast<Employee*>(person1)};
    employee1->print();

    // обратное динамическое преобразование (во время выполнения) - с помощью функции dynamic_cast
    // если преобразование неудачно, то возвращается nullptr
    Employee* employee2 {dynamic_cast<Employee*>(person1)};
    if(employee2)
    {
        employee2->print();
    }


    // преобразование smart-указателей
    // автопреобразование из производного типа в базовый
    std::shared_ptr<Person> person3{std::make_shared<Employee>()};
    // динамическое преобразование из Book в Ebook
    // если преобразование неудачно, то возвращается nullptr
    std::shared_ptr<Employee> employee3{std::dynamic_pointer_cast<Employee>(person3)};
    if(employee3)   // если не равен nullptr
    {
        employee3->print();
    }
}

C#

// автопреобразование из произодного типа в базовый
Person tom = new Employee();
tom.Print();

// обратное преобразование из базового типа в производный
// проверяем тип и при удачной проверке преобразуем в Employee и помещаем в переменную emp
if(tom is Employee emp) 
{
    emp.Print();
}

// с помощью операции as
Employee? emp2 = tom as Employee;
if(emp2 != null)    // если преобразование прошло успешно 
{
    emp2.Print();
}

// с помощью операции преобразования
// если tom не представляет объект Employee, то генерируется исключение InvalidCastException
Employee emp3 = (Employee)tom;
emp3.Print();

class Person
{
    public virtual void Print() => Console.WriteLine("Person");
}
class Employee : Person
{
    public override void Print() => Console.WriteLine("Employee");
}

Dart

 class Person{
  
    void display() => print("Person");
}
class Employee extends Person{

    @override
    void display() => print("Employee");
}

void main (){
     
    // автопреобразование из произодного типа в базовый
    Person tom = Employee();
    tom.display();

    // обратное преобразование из базового типа в производный
    if(tom is Employee) // проверяем тип
    {
        Employee emp = tom as Employee; // преобразование
        emp.display();
    }
}

F#

type Person() =
    member this.Print() = printfn "Person"
 
type Employee() = 
    inherit Person()
    member this.Print() = printfn "Employee"
 
 
// автопреобразование из произодного типа в базовый
let tom: Person = Employee()
tom.Print()

// обратное преобразование из базового типа в производный
if tom :? Employee then
    let emp = tom :?> Employee // преобразование
    emp.Print()
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850