面向对象的三大特性

简介: 面向对象的三大特性

封装、继承、多态

注意: 1. 非静态成员函数不属于类对象上;2. 如果类有虚函数表指针指向虚函数表,类的各个对象分别持有虚函数表指针指向该虚函数表。

多态原理

  1. 多态的条件: a. 有继承关系;b. 子类重写父类中的虚函数。
  2. 多态使用: 当父类的指针或引用指向子类的对象。

静态多态:

//早绑定
#include <iostream>
using namespace std;
class A {
public:
  int sum(int a, int b) {  //符号表中_ZN1A3sumEii
    return a + b;
  }
  double sum(double a, double b) {  //_ZN1A3sumEdd
    return a + b;
  }
};
int main() {
  A a;
  a.sum(1, 2);
  a.sum(3.0, 4.0);
  return 0;
}
$ g++ polymorohism_static.cpp -o p1.o
$ objdump -t p1.o

SYMBOL TABLE:

早绑定:

//早绑定
#include <iostream>
using namespace std;
class Base {
public:
  void func() {
    cout << "Base::func" << endl;
  }
};
class Drive {
public:
  void func() {
    cout << "Drive::func" << endl;
  }
};
int main() {
  Base* pbase1 = new Base();
  Base* pbase2 = new Drive();
  pbase1->func();
  pbase2->func();
  return 0;
}

代码运行结果

Base::func
Base::func

晚绑定:

//晚绑定
#include <iostream>
using namespace std;
class Base {
public:
  virtual void func() {  //虚函数晚绑定
    cout << "Base::func" << endl;
  }
};
class Drive : public Base {
public:
  void func() {
    cout << "Drive::func" << endl;
  }
};
int main() {
  Base* pbase1 = new Base();
  Base* pbase2 = new Drive();
  pbase1->func();
  pbase2->func();
  return 0;
}

代码运行结果

Base::func
Drive::func

利用虚函数表指针实现

#include <iostream>
using namespace std;
class Base {
public:
  virtual void func() {
    cout << "Base::func" << endl;
  }
};
class Drive : public Base {
public:
  void func() {
    cout << "Drive::func" << endl;
  }
};
int main() {
  typedef void (*Func)(void);
  Base* pbase1 = new Base();
  Base* pbase2 = new Drive();
  //(long*)pbase1:每个类前面的8个字节为虚函数表指针
  //*(long*)pbase1:取地址,得到虚函数表
  long *vptr1 = (long*)*(long*)pbase1;
  Func f1 = (Func)vptr1[0];
  f1();
  long *vptr2 = (long*)*(long*)pbase2;
  Func f2 = (Func)vptr2[0];
  f2();
  //pbase1->func();
  //pbase2->func();
  return 0;
}

代码运行结果

Base::func
Drive::func

多态实现图:

充电站

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
1月前
|
缓存 并行计算 算法
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
如何实现面向对象
如何实现面向对象
56 0
|
6月前
|
存储 人工智能 运维
面向对象基础
面向对象基础
66 0
面向对象基础
|
Java
面试--什么是面向对象?面向对象三大特性?
面试--什么是面向对象?面向对象三大特性?
64 0
|
存储 编译器 C++
C++ 面向对象三大特性——多态
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的多态。
|
安全 Java 编译器
C++ 面向对象三大特性——继承
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的继承。
|
数据可视化 程序员 C#
C# 面向对象三大特性
C# 面向对象三大特性
109 0
C++面向对象的概念和特点
C++面向对象的概念和特点
面向对象概念
1. Coad和Yourdon给出了一个定义:面向对象=对象+类+继承+通信 2. 如果一个软件系统使用这样4个概念设计和实现,则我们认为这个软件系统是面向对象的 什么是对象(object)
90 0