C++面向对象常考题
面向对象的三个基本特征,并简述之
- 封装
将客观事物抽象成类,每个类对自身的数据和方法实行protection
- 继承
public private protected三种继承
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
#include <iostream>
using namespace std;
class A{
public :
A()
{
a = 10;
}
protected:
int a;
};
class B:public A
{
public:
int getAa()
{
return a;
}
};
int main()
{
B b;
cout<<b.getAa()<<endl;
cout<<b.a<<endl; // b.a is private or protected, you can not access it.
}
http://blog.chinaunix.net/uid-20665441-id-305470.html
多态
是将父对象设置成为和一个或更多的它的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是:允许将子类类型的指针赋值给父类类型的指针。
重载与重写
定义上不同,重载是不同函数签名,只是函数名字一样而已。重写是发生在类中,是子类重新定义父类虚函数的方法。
实现原理上不同。对两个函数签名不一样的函数的调用,在编译阶段就可以确定,是静态调用,地址在编译器就绑定了。因此重载与多态无关。
重写与多态有关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数。这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此这样的函数地址是在运行期绑定的(晚绑定)。