您的位置:首页 > 编程语言 > C语言/C++

c++基础 之 面向对象特征一 : 继承

2013-09-17 00:22 489 查看
class Base

{

public:

void f()

{

cout<<"void f()"<<endl<<endl;

}

void f(int i)

{

cout<<"void f(int)"<<endl<<endl;

}

void h()

{

cout<<"void h()"<<endl<<endl;

}

void g(char s)

{

cout<<"void g(char)"<<endl<<endl;

}

protected:

private:

};

class Devie1 : public Base

{

public:

void h() // 重定义 覆盖父类的h()

{

cout<<"Devie1 void h()"<<endl<<endl;

}

protected:

private:

};

class Devie2 : public Base

{

public:

void f()// 重定义 覆盖了父类的所有重载函数 f() f(int a)

{

cout<<"Devie2 void f()"<<endl<<endl;

}

void g() // 隐藏 父类的 g(char s)

{

cout<<"Devie2 void g()"<<endl<<endl;

}

protected:

private:

};

int _tmain(int argc, _TCHAR* argv[])

{

Base b;

b.f();

b.f(2);

b.g('3');

b.h();

Devie1 d1;

d1.f(1);//继承

d1.f();//继承

d1.g('1');//继承

d1.h();//覆盖

Devie2 d2;

d2.f();//覆盖

//找不到Base::f(int) 被隐藏 覆盖父类的 f()

d2.g();//隐藏

//找不到父类的Base::g(char s) 被隐藏

d2.h();//继承

//可以看出,若子类没有重定义父类的操作,子类会调用父类的函数。

//如果子类重定义,分两种情况:

//1.子类重定义父类的函数,返回值和参数列表一致,此为 覆盖 override

//子类和基类一样可以发相同的消息,但是子类表现出不同于父类的行为。。。。

//2.子类重定义了父类的成员函数,但是修改了返回值或者参数列表,此为隐藏 name hiding

//子类重定义父类的重载函数 时 将导致该函数的所有版本在子类中被自动隐藏。。。

//d1.f()先在子类找f() 找不到再到父类找,如果在子类找到了就使用了。。。

//替代原则:向上类型转换

//在任何需要基类对象(指针)的地方,都可以用子类的对象(指针)来代替

return 0;

}

//可以看出,若子类没有重定义父类的操作,子类会调用父类的函数。

//如果子类重定义,分两种情况:

//1.子类重定义父类的函数,返回值和参数列表一致,此为 覆盖 override

//子类和基类一样可以发相同的消息,但是子类表现出不同于父类的行为。。。。

//2.子类重定义了父类的成员函数,但是修改了返回值或者参数列表,此为隐藏 name hiding

//子类重定义父类的重载函数 时 将导致该函数的所有版本在子类中被自动隐藏。。。

//d1.f()先在子类找f() 找不到再到父类找,如果在子类找到了就使用了。。。

//替代原则:向上类型转换

//在任何需要基类对象(指针)的地方,都可以用子类的对象(指针)来代替
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: