1:关于继承(inheritance)的概念
在C++中有“has A" 和 "is A"的 两个概念。
1.1 ” has A“即为在一个类定义中包含另一个类的对象:
class A
{
class B;
}
1.2: "Is A" 即我们说的继承: 如下,B继承A, A为基类,B为A的派生类,B继承了A的所有数据成员和成员函数。
class A: public class B
{
}
1.3: 关于upcasting 和downcasting
1.3.1: 因派生类继承了基类的所有数据成员和成员函数,因此指向基类的指针或引用可以指向派生类对象。
这即为隐式upcasting 强制转换。
B b; A &a = b;
B b; A *a = &b;
1.3.2: 因派生类不但继承了基类的所有数据成员和成员函数,还增加自己独有的数据成员或成员函数,
因此不能直接将将一个派生类的引用或指类直接指向一个基类对象,因为派生类的部分数据成员呀
成员函数可能没有。
Class A
{
}
Class B: public A
A a;
B &b = a; //不能这样做
A a;
B *b = &a; //不能这样做
1.4: 关于虚函数
1.41 派生类不仅可能会增加成员函数也可能重定义基类的实现的函数以实现派生类所需要的功能。
C++引入虚函数概念(virtual), 基类将该成员函数声明为virtual函数,派生类则可以重定义基类中已实现的成员函数
以实现不同的功能。这样因为调用成员函数的对象类型不同而使得函数实现的功能不同即为多态。
class A
{
virtual method1(arg1);
};
class B:public A
{
virtual method(arg1,arg2);
};
1.4.2: 如基类的某个成员函数被声明的virtual,则其在派生类也为virtual。
1.4.3: 派生类中重定义的virtual函数会隐藏其类中的函数重载。如想使该成员函数在派生类中也重载,
则应在派生类对中每个virtual重载函数重新定义
class A
{
virtual method1(arg1);
virtual method1(arg1,arg2,arg3);
};
class B:public A
{
virtual method(arg1);
virtual method1(arg1,arg2,arg3);
};
1.4: 关于动态绑定和静态绑定
1.4.1: 静态绑定 即编译时绑定:编译时根据函数名和函数参数列表来决定执行哪个函数.
eg:
class A
{
method1(arg1)
};
class B:public A
{
};
A a;
A &b = a;
a.method1(arg1); //这时调用 的是A.0000000000method1(arg1);
B b;
A &a = b;
a.method1(arg1); //这时仍然调用 的是A.method1(arg);
1.4.2: 动态绑定: 因为派生类中可能重定了基类中的成员函数(vitual函数),因此有时需
根据调用成员函数的对象类型来选择使用哪个成员函数定义来执行,这即为
动态绑定。
eg:
class A
{
virtual method1(arg1);
virtual method1(arg1,arg2,arg3);
};
class B:public A
{
virtual method(arg1);
virtual method1(arg1,arg2,arg3);
};
B b;
A &a = b;
b.method1(arg1); //这时调用 的是B.method1(arg1);
A a;
A &b = a;
b.method1(arg1); //这时调用 的是A.method1(arg);
1.5:关于虚析构函数
不管是否声明了虚成员函数,都有必要声明一个虚析构函数,尽管它可能什么也没做。