深入理解C++的多态

一. 编译器对C++的多态是通过在Class里面插入一个vptr指针,同时生成一个virtual table, 让vptr指向这个virtual table来实现的,那么什么样的Class才有必要设置vptr指针呢?如下图所示:

下面分6种情况讨论

(1)有虚函数的基类

Cpp代码 复制代码

  1. class A {
  2. public:
  3. virtual void foo() {}
  4. protected:
  5. int i;
  6. };

class A { public: virtual void foo() {} protected: int i; };

(2) 没有虚函数的基类

Cpp代码 复制代码

  1. class A {
  2. public:
  3. void foo() {}
  4. protected:
  5. int i;
  6. };

class A { public: void foo() {} protected: int i; };

(3) 虚继承,基类有vptr

Cpp代码 复制代码

  1. class Base {
  2. public:
  3. virtual ~Base() {}
  4. virtual void foo() {}
  5. virtual void bar() {}
  6. protected:
  7. int i;
  8. };
  9. class Derived : public virtual Base {
  10. public:
  11. ~Derived() {}
  12. void bar() {}
  13. protected:
  14. int j;
  15. };

class Base { public: virtual ~Base() {} virtual void foo() {} virtual void bar() {} protected: int i; }; class Derived : public virtual Base { public: ~Derived() {} void bar() {} protected: int j; };

(4)非虚继承,基类没有vptr,派生类没有虚函数

Cpp代码 复制代码

  1. class Base {
  2. public:
  3. ~Base() {}
  4. void foo() {}
  5. void bar() {}
  6. protected:
  7. int i;
  8. };
  9. class Derived : public Base {
  10. public:
  11. ~Derived() {}
  12. void bar() {}
  13. protected:
  14. int j;
  15. };

class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} void bar() {} protected: int j; };

(5)非虚继承,基类没有vptr,派生类有虚函数

Cpp代码 复制代码

  1. class Base {
  2. public:
  3. ~Base() {}
  4. void foo() {}
  5. void bar() {}
  6. protected:
  7. int i;
  8. };
  9. class Derived : public Base {
  10. public:
  11. ~Derived() {}
  12. virtual void bar() {}
  13. protected:
  14. int j;
  15. };

class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} virtual void bar() {} protected: int j; };

(6) 非虚继承,基类有vptr

Cpp代码 复制代码

  1. class Base1 {
  2. public:
  3. virtual ~Base1() {}
  4. virtual void foo() {}
  5. virtual Base1 *clone() const {}
  6. protected:
  7. int i;
  8. };
  9. class Base2 {
  10. public:
  11. virtual ~Base2() {}
  12. virtual void bar() {}
  13. virtual Base2 *clone() const {}
  14. protected:
  15. int j;
  16. };
  17. class Derived : public Base1, public Base2 {
  18. public:
  19. virtual ~Derived() {}
  20. virtual Derived *clone() const {}
  21. protected:
  22. int k;
  23. };

class Base1 { public: virtual ~Base1() {} virtual void foo() {} virtual Base1 *clone() const {} protected: int i; }; class Base2 { public: virtual ~Base2() {} virtual void bar() {} virtual Base2 *clone() const {} protected: int j; }; class Derived : public Base1, public Base2 { public: virtual ~Derived() {} virtual Derived *clone() const {} protected: int k; };

  • 8f506d33-5902-38bf-a7a7-0cf005c01f3f-thumb.jpg
  • 大小: 9 KB

转载于:https://www.cnblogs.com/kayfans/archive/2012/06/19/2555268.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值