Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- class A
- {
- public:
- virtual ~A();
- std::string Name();
- private:
- virtual std::string DoName();
- };
- class B1 : virtual public A
- {
- private:
- std::string DoName();
- };
- class B2 : virtual public A
- {
- private:
- std::string DoName();
- };
- A::~A() {}
- std::string A::Name() { return DoName(); }
- std::string A::DoName() { return "A"; }
- std::string B1::DoName() { return "B1"; }
- std::string B2::DoName() { return "B2"; }
- class D : public B1, public B2
- {
- private:
- std::string DoName () { return "D"; }
- };
- void f1( A& x ) { std::cout << "f1:" << x.Name() << std::endl; }
- void f2( B1& x ) { std::cout << "f2:" << x.Name() << std::endl; }
- void f3( B2& x ) { std::cout << "f3:" << x.Name() << std::endl; }
- void g1( A& x ) { std::cout << "g1:" << x.Name() << std::endl; }
- void g2( B1& x ) { std::cout << "g2:" << x.Name() << std::endl; }
- void g3( B2& x ) { std::cout << "g3:" << x.Name() << std::endl; }
- int main()
- {
- D d;
- B1* pb1 = &d; // Преобразование D* -> B*
- B2* pb2 = &d;
- B1& rb1 = d; // Преобразование D& -> B&
- B2& rb2 = d;
- f1(d);
- f2(d);
- f3(d); // Полиморфизм
- g1(d);
- g2(d);
- g3(d); // Срезка
- // dynamic_cast/RTTI
- std::cout << ((dynamic_cast<D*>(pb1) != 0) ? "ok " : "bad " );
- std::cout << ((dynamic_cast<D*>(pb2) != 0) ? "ok " : "bad " );
- try
- {
- dynamic_cast<D&>(rb1);
- std::cout << "ok ";
- } catch(...)
- {
- std::cout << "bad ";
- }
- try
- {
- dynamic_cast<D&>(rb2);
- std::cout << "ok ";
- } catch(...)
- {
- std::cout << "bad ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement