1.
class Base
{
public:
int m_a,m_b;
Base(int a = 2,int b = 5):m_a(a),m_b(b) { }
int func_a()
{
return m_a - m_b;
}
virtual int func_b()
{
return m_a + m_b;
}
};
class Derived:public Base
{
public:
Derived(int a = 4, int b = 7):Base(a, b) { }
virtual int func_a()
{
return m_b + m_a;
}
int func_b()
{
return m_b - m_a;
}
};
int main(void)
{
Base *aa, *bb;
aa = new Base(4, 7);
bb = new Derived(3, 5);
printf("%d %d %d %d\n",aa->func_a(), aa->func_b(), bb->func_a(), bb->func_b());
delete aa;
delete bb;
return 0;
}
注意:func_a是在派生类中成为派生类的虚函数的,aa->func_a,bb->func_b调用的都是基类的func_a函数。派生类中的func_b改写了基类的func_b,所以呈现出多态!
程序输出:-3 11 -2 2
2.
struct SC
{
int a;
int b;
int c;
};
struct SD
{
int a;
int b;
int c;
int d;
};
int main(void)
{
struct SC c1[] = {{3},{4},{5},{6}};
struct SD *c2 = (struct SD*)c1 + 1;
printf("%d %d %d %d\n",c2->a,c2->b,c2->c,c2->d);
return 0;
}
注意:struct SC c1[] = {{3},{4},{5},{6}};----->struct SC c1[]={{3,0,0},{4,0,0},{5,0,0},{6,0,0}};
是不是明白什么了!注意c2 = (struct SD*)c1 + 1 ----> c2 = (struct SD*)c1 + sizeof(struct SD);指针的加法运算!
程序输出: 0 0 5 0
3.编写一个函数,实现类似strcpy的字符串复制函数。原型定义为char *mystrcopy(char *dest,char *src)。功能是src所指的字符串复制到dest所指的数组中,返回dest指针。提示:src和dest所指的内存区域有可能重叠。
char *mystrcopy(char *dest,char *src)
{
assert(dest != NULL && src != NULL );
int count = 0;
count = strlen(src)+1;
if( count<=1)
return NULL;
char *d = dest;
char *s = src;
if( src == dest ){
return src;
}
if( dest < src || dest >= (src+count))
{
while(count--)
{
*d++ = *s++;
}
}
else
{
d = dest+count;
s = src + count;
while( count--)
*d-- = *s--;
}
return dest;
}
注意:assert是宏,而不是函数。在C的 assert.h 头文件中。