本题主要考的是C语言,和C++的区别,以及C++中继承和多态的概念
C语言和C++的区别
一 C语言是面向过程的语言,C++是基于面向对象的语言(注意:不是纯面向对象,因为兼容C语言)
1 面向过程:面向过程就是分析解决问题的步骤,然后用函数把这些步骤一步一步的进行实现,在使用的时候进行一一调用就行了,注重的是对于过程的分析。
面向对象:就是指把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
2 面向过程是以步骤为核心,后期难以维护,面向对象是以数据为核心,有较强的稳定性可维护性较强
二 面向对象三大特性
封装:对于封装来说就是数据与具体操作实现的代码都放在某个对象的内部,使这些代码的具体细节不被外界发现,只留下一些接口供外部使用。使用封装能够隐藏具体的实现细节,使代码更加易于维护,并且保证了系统的安全性。
继承:继承是面向对象程序设计,使代码复用最重要手段。它允许程序员在保证原有类特征的基础上,进行扩展来增加功能。
多态:简单点说就是“一个接口,多种实现”,就是同一种事物表现出的多种形态。复用相同接口,实现不同的操作。
三 C++的多态分为两种
静态多态(编译时多态):编译时多态是通过重载函数来实现的。编译器在编译期间根据函数实参类型,可推断出要调用哪个函数,如果有对应的函数就调用相应的函数,否则就报一个编译错误。
动态多态(运行时多态):通过子类重写虚函数来实现的。在函数执行期间,根据所指向对象的实际类型,调用相应的方法。
总的来说:封装可以隐藏实现细节,使代码模块增加安全指数。继承可以扩展已存在的模块,增加代码的复用性;多态实现了接口的重用。
C++中的多态:
#include<iostream>
using namespace std;
class A
{
public:
virtual void Fun()
{
cout << "FunA()" << endl;
}
};
class B :public A
{
public:
virtual void Fun()//子类对父类的重写
{
cout << "FunB()" << endl;
}
};
int main()
{
A a;
B b;
A *pa = &a;//父类指针指向父类对象
pa->Fun();
pa = &b;//父类指针指向子类对象
pa->Fun();
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
//这里注意 c语言中结构体不能套用,所以虽然是说是c语言模拟实现。其实还是.cpp
struct A//父类
{
void(*f)(); //定义了一个函数指针f,f指向的函数返回值为void,参数为空 类似于int *p
};
struct B//子类
{
A a;//在子类中定义一个基类的对象即可实现对父类的继承
};
void FunA()
{
printf(" FunA\n");
}
void FunB()
{
printf(" FunB\n");
}
int main()
{
A a;
B b;
a.f = &FunA;//给父类函数指针赋值 int *p =&a; //当然本题中&FunA也可以直接写为FunA 因为函数名就可以表示函数的地址
b.a.f = &FunB;//给子类函数指针赋值
A* a2 = &a;//父类指针指向父类对象
a2->f();
a2 = (A*)&b;//父类指针指向子类对象
a2->f();
system("pause");
return 0;
}