面向对象
- 1.什么是类?
- 2.面向对象程序设计思想?
- 3.多态的实现?
- 4.动态多态的作用?
- 5.动态绑定的实现?
- 6.纯虚函数的作用以及实现?
- 7.虚函数表如何维护?
- 8.C++ struct和类的区别?
- 9.C++中类成员的访问权限?
1.什么是类?
是一种用户定义的数据类型,包含了数据成员和函数成员。数据成员存储与类相关的状态,函数成员定义对数据进行操作的方法。
2.面向对象程序设计思想?
面向对象程序设计(OOP)有三大特征,封装继承和多态。
封装
:将数据属性和操作方法打包,形成独立的对象,只暴露必要的接口。
继承
:允许子类继承父类的属性和方法,并且可以创建新的方法。
多态
:不同类的对象使用同一接口进行调用,有不同的行为。
3.多态的实现?
- 静态多态:编译时发生,通过函数重载、运算符重载实现
函数重载
:参数类型或者数量不同来实现运算符重载
:为类定义新的操作符函数
- 动态多态:运行时发生,通过虚函数实现
虚函数
:一个函数在基类被声明为虚函数时,可以在派生类重写纯虚函数和抽象类
:类中声明一个虚函数不提供实现(=0)包含纯虚函数成为抽象类,抽象类不能被实例化,只能被继承,派生类必须提供纯虚函数的实现。
4.动态多态的作用?
允许运行时通过基类指针或引用调用派生类的方法,使得相同操作有不同的效果。
实现的必要条件:
1.继承
:必须有两个类,基类和派生类
2.基类中有虚函数
:基类中至少一个函数被virtual关键字声明为虚函数,派生类通常会重写该虚函数
3.基类的指针或引用
:需要通过基类的指针或引用掉用虚函数,这样c++运行时才能够根据虚函数表来决定调用哪个函数
4.动态绑定
5.动态绑定的实现?
通过虚函数实现。当我们用基类指针或引用调用一个虚函数,C++会根据对象实际类型决定调用的函数。示例code如下:
//基类
class Animal {
virtual void Sound() {
std::cout << "animal sound" << std::endl;
}
};
//派生类
class Dog: public Animal {
void Sound() override {
std::cout << "Woof" << std::endl;
}
};
class Cat: public Animal {
void Sound() override {
std::cout << "Maio" << std::endl;
}
};
//基类指针调用派生类
Animal* animal = new Dog();
animal->Sound();//输出Woof
6.纯虚函数的作用以及实现?
纯虚函数用于创建抽象类,不能直接实例化,只能被继承,用于定义派生类应当遵循的接口。
作用:
定义接口规范
:规定了派生类必须实现的函数,确保各派生类都遵循同一接口规范阻止基类实例化
:不能创建基类的对象,只能创建派生类对象
7.虚函数表如何维护?
当我们定义一个类,并且类中有虚函数时,这个类就会有一个虚函数表,存放类中所有虚函数地址的数组,在编译时,一个类的虚函数表就确定了,它放在了只读数据段中。。每一个实例,只要他的类有虚函数,那么就会有一个指向该虚函数表的指针,虽然不同的实例有自己的虚函数表指针,但是同一个类的所有对象共享一个虚函数表。
比如说:
//基类
class Animal {
virtual void Sound() {
std::cout << "animal sound" << std::endl;
}
};
//派生类
class Dog: public Animal {
void Sound() override {
std::cout << "Woof" << std::endl;
}
};
class Cat: public Animal {
void Sound() override {
std::cout << "Maio" << std::endl;
}
};
Animal* pig = new Animal();
Animal* mouse = new Animal();
pig
和mouse
都有一个指针指向Animal
的虚函数表,但是他们指向的虚函数表是相同的。
上述代码中子类cat
继承自Animal
,cat
类也会有虚函数表,但是sound()
函数被重写了,cat
类中虚函数表中sound
的地址会被替换为cat sound
的地址。
推荐阅读
C++多态虚函数表详解(多重继承、多继承情况)
C+±[override]关键字使用详解
8.C++ struct和类的区别?
在c++中极其相似,都可以包含数据成员,成员函数,构造析构函数,成员函数重载,运算符重载等。只有默认访问权限和默认继承类型的区别。
默认访问权限
:class是private,struct是public
默认继承类型
:class是private,struct是public
9.C++中类成员的访问权限?
三个访问修饰符
public
:任何地方都可以访问
protect
:类内部和派生类可以访问,但是不能通过类的对象直接访问
private
:类内部访问,只能被类的成员函数、友元函数访问