C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数
何为继承 ?
定义:在C++中所谓的继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类”或者“父类”,新建立的类称为“派生类”或者“子类”,一个新类从已有的类那里获得其已有特性,这种现象称为类的继承,类的继承是用已有的类来建立专用类的编程技术。
优点: a) 代码复用
b) 提高程序的可扩展性
特点: a) 传递性
b) 单根性:一个类只能有一个父类但可以有多个子类
c) 相对性:描述一个类时应该说类A相对于类B是子类或父类,而不能简单的定义类A是子类或父类
何为多态?
多态就是向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(方法);
例如:使用运算符“+”使两个数值相加,就是发送一个消息,他要调用operator+函数,实际上,整型,单精度型,双精度型的加法操作过程是互相不同的,是由不同内容的函数实现的。很明显,它们是通过不同的方法来响应同一消息。
在C++中,多态的表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数。总而言之,多态就是“一个接口,多种方法”。
实现多态的条件:
1:派生类重写基类虚函数
2:通过基类指针或引用调用基类虚函数(该虚函数在派生类中必须被重写)
//c++
class base
{
public:
virtual void fun()//虚函数
{
cout << "base:;fun()" <<endl;
}
};
class derived :public base
{
public:
virtual void fun()
{
cout << "derived::fun()" << endl;
}
};
void test()
{
base b;//基类对象
derived d;//派生类对象
base* pb = &b;//父类指针指向父类对象
pb->fun();//调用base::fun()
pb = &d;//父类指针指向派生类对象
pb->fun();//调用derived::fun()
}
//C
typedef void(*fun)();//重定义一个函数指针类型
基类
struct base
{
fun b;
};
派生类
struct derived
{
base d;//在派生类中定义一个基类的对象即可实现对基类的继承
};
void funb()
{
printf("base::fun()\n");
}
void fund()
{
printf( "derived::fun()\n");
}
void test()
{
base _b;//基类对象
derived _d;//派生类对象
_b.b = funb;//基类对象调用基类同名函数
_d.d.b = fund;//派生类调用派生类的同名函数
base *pb = &_b;//基类指针指向基类对象
pb->b();
pb = (base *)&_d;//让基类指针指向派生类的对象,类型不同必须进行强转
pb->b();
}