C++
C#
Dart
F#
#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(); } }
// автопреобразование из произодного типа в базовый 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"); }
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(); } }
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()