【c++】面向对象三大特性之——多态
小编个人主页详情 public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout ps.BuyTicket(); } int main() { Person ps; Student st; fun(ps); fun(st); return 0; } public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout public: //void BuyTicket() virtual void BuyTicket() { cout ps.BuyTicket(); } int main() { Person ps; Student st; fun(ps); fun(st); return 0; } }; class B:public A {}; class Person { public: virtual A* BuyTicket() { cout public: virtual B* BuyTicket() { cout ps.BuyTicket(); } int main() { Person ps; Student st; fun(ps); fun(st); return 0; } public: virtual const Person& BuyTicket() { cout public: virtual const Student& BuyTicket() { cout ps.BuyTicket(); } int main() { Person ps; Student st; fun(ps); fun(st); return 0; } public: ~Person() { cout public: ~Student() { cout Person* ps = new Student; delete ps; return 0; } public: virtual ~Person() { cout public: virtual ~Student() { cout Person* ps = new Student; delete ps; return 0; } public: virtual ~Person() { cout public: virtual ~Student() { cout public: virtual void BuyTicket() { cout public: virtual void BuyTicket(int i) override { cout return 0; } public: virtual void BuyTicket() final { cout public: virtual void BuyTicket() { cout return 0; } public: }; class B :public A { public: }; int main() { B b; return 0; } private: A() {} }; class B :public A { public: B() {} }; int main() { B b; return 0; } public: static A RET_A() { return A(); } void fun() { cout } }; class B //:public A { public: B() {} }; int main() { B b; A::RET_A().fun(); return 0; } private: ~A() {} }; class B :public A { public: ~ B() {} }; int main() { B b; return 0; } public: void Destorty() { cout } }; class B //:public A { public: ~ B() {} }; int main() { A* a = new A; a-Destorty(); return 0; } }; class B :public A {}; int main() { B b; return 0; } public: virtual void fun1() = 0; virtual void fun2() = 0; }; class B :public A {}; int main() { B b; return 0; } public: virtual void fun1() = 0; virtual void fun2() = 0; }; class B :public A { public: virtual void fun1() { cout cout B b; b.fun1(); b.fun2(); return 0; } public: virtual void fun1() = 0; }; class B :public A { public: virtual void fun1() { cout public: virtual void fun1() { cout a.fun1(); } int main() { B b; C c; fun(b); fun(c); return 0; } public: virtual void fun1() { cout A a; cout public: virtual void fun1() { cout cout cout A a; cout public: virtual void fun1() { cout cout cout public: virtual void fun1() { cout A a; B b; return 0; } public: virtual void fun() { cout int a = 0; //普通的变量存储在栈上 int* ptr = new int;//动态开辟是在堆上 static int b = 0; //静态变量存储在数据段(静态区) const char* str = "hello cpp";//常量字符串是在代码段(常量区) cout cout fun(); return 0; } public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout ps.BuyTicket(); } int main() { Person ps; Student st; fun(ps); fun(st); return 0; } public: virtual void fun1() { cout cout public: virtual void fun1() { cout A a; B b; b._a = 999; a = b; return 0; } public: virtual void fun1() { cout cout A a1; A a2; return 0; } public: virtual void fun1() { cout cout public: virtual void fun1() { cout cout A a; B b; return 0; } //定义一个指向函数指针的指针,用于接收虚表指针 int i = 0; while (*ptr != nullptr) { //将指向函数指针的指针进行解引用,那么拿到的就为虚表中的函数指针 //即虚函数的指针,那么由于编译器会再虚表的最后放置一个nullptr //所以我们就可以利用这个去判断打印的结束条件 printf("虚函数[%d]:[%p]-", i++, *ptr); //那么使用i变量作为打印到第几个虚函数的标记 //将ptr进行解引用,那么拿到的就为虚表中的虚函数的指针,那么使用%p //的格式在printf中进行打印即可 PTR tmp = *ptr; //这里用当前ptr解引用后将虚函数的地址赋值给PTR类型的函数指针tmp, //那么函数指针tmp指向虚函数,那么就可以进行调用,这里的调用无视 //类的访问限定符的规则,即public和protected以及private访问限定 //符限制的都可以进行访问并且调用,对于任何一个函数来讲,只要有函 //数的地址传入对应的参数就可以进行调用,因为函数名的本质也是函数 //的地址 tmp(); //这里小编设置的虚函数都是无参的,即都可以进行无参调用,这里调用 //一下虚函数,小编编写的虚函数做了特殊处理,即调用虚函数之后会打 //印对应的类和函数名,那么我们就可以根据这个特点来判别当前虚函数 //是哪一个 ptr++; //将指向函数指针的指针向后迭代,结束条件是遇到空才结束 } } int main() { A a; B b; Print_VFT((PTR*)*((int*)&b)); //这里先取出虚表指针,由于虚表指针是使用int*的指针解引用拿到的,所以 //这里的虚表指针是10进制的int的整数,必然会和PTR类型不兼容,所以这里 //我们强制类型转换一下即可 return 0; } public: virtual void fun1() { cout cout public: virtual void fun1() { cout cout public: virtual void fun1() { cout cout int i = 0; while (*ptr != nullptr) { printf("虚函数[%d]:[%p]-", i++, *ptr); PTR tmp = *ptr; tmp(); ptr++; } } int main() { C c; cout C c; A& a = c; B& b = c; a.fun1(); b.fun1(); return 0; }