面向对象的三大特性

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

封装、继承、多态

注意: 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等技术内容,立即学习

相关文章
如何实现面向对象
如何实现面向对象
61 0
|
8月前
|
存储 人工智能 运维
面向对象基础
面向对象基础
72 0
面向对象基础
|
Java
面试--什么是面向对象?面向对象三大特性?
面试--什么是面向对象?面向对象三大特性?
81 0
|
存储 编译器 C++
C++ 面向对象三大特性——多态
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的多态。
|
安全 Java 编译器
C++ 面向对象三大特性——继承
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的继承。
|
数据可视化 程序员 C#
C# 面向对象三大特性
C# 面向对象三大特性
124 0
面向对象概念
1. Coad和Yourdon给出了一个定义:面向对象=对象+类+继承+通信 2. 如果一个软件系统使用这样4个概念设计和实现,则我们认为这个软件系统是面向对象的 什么是对象(object)
105 0
C++面向对象的概念和特点
C++面向对象的概念和特点
理解面向对象特性之多态
多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
178 0
|
程序员 数据安全/隐私保护 C++
C++面向对象封装特性的实例分析与应用扩展(一)
生活中充满复杂性,处理复杂性的方法之一就是简化和抽象。在计算中,为了根据信息与用户之间的接口来表示它,抽象是至关重要的。将问题的本质特征抽象出来,并根据特征来描述解决方案。抽象往往是用户定义类型的捷径,在C++中用户定义类型指的就是实现抽象接口的类设计。
137 1
C++面向对象封装特性的实例分析与应用扩展(一)