c++之——派生类的同名成员和函数调用方式及构造析构顺序
#include<iostream>
using namespace std;
class Object {
public:
Object(int test) :a(), b(), c() { cout << "object 构造\n"; }
~Object()
{
cout << "object 析构\n";
}
int a;
int b;
int c;
void same_fuc()
{
cout << "object test...\n";
}
void o_print()
{
cout << "a b c is" << a << " " << b << " " << c << endl;
} };
class Parent :public Object {
public:
Parent(int test):Object(), a(),b(),c(),obj1(),obj2()//NOTE
{
cout << "parent 构造。。。\n";
}
~Parent()
{
cout << "Parent 析构。。。\n";
}
int a;
int b;
int c;
void same_fuc()
{
cout << "Parent test...\n";
}
void p_print()
{
cout << "a b c is" << a << " " << b << " " << c << endl;
}
Object obj1;
Object obj2;
};
class Child :public Parent
{
public:
Child() :Parent(), a(), b(), c() { cout << "child 构造\n"; }
~Child()
{
cout << "child 析构,,,\n";
}
void c_print()
{
cout << "a b c is" << a << " " << b << " " << c << endl;
}
void same_fuc()
{
cout << "child test...\n";
}
int a;
int b;
int c;
}; int main()
{ Child c1;
c1.c_print();
c1.a = ;//默认等价于c1.Child::a=520;
c1.c_print();
c1.Parent::a = ;
c1.p_print();
c1.c_print();
c1.Object::a = ;
c1.o_print();
c1.c_print(); c1.same_fuc();//默认等价于c1.Child::same_fuc();
c1.Parent::same_fuc();
c1.Object::same_fuc();
return ;
}

上诉代码,如果直接使用子类对象调用子类的某个和父类同名函数或者使用同名变量,默认使用子类的,但我们可以加上域作用符强制使用父类的属性或者方法。
同名函数再探:
#include<iostream>
using namespace std; class Parent {
public:
Parent(int test):a(),b(),c()
{
cout << "parent 构造。。。\n";
}
~Parent()
{
cout << "Parent 析构。。。\n";
}
int a;
int b;
int c;
virtual void same_fuc()//不加virtual就不会产生多态
{
cout << "Parent test...\n";
}
void p_print()
{
cout << "a b c is" << a << " " << b << " " << c << endl;
} };
class Child :public Parent
{
public:
Child() :Parent(), a(), b(), c() { cout << "child 构造\n"; }
~Child()
{
cout << "child 析构,,,\n";
}
void c_print()
{
cout << "a b c is" << a << " " << b << " " << c << endl;
}
void same_fuc()
{
cout << "child test...\n";
}
int a;
int b;
int c;
};
void test(Parent &p)
{
p.same_fuc();
}
int main()
{ Child c1;
test(c1);
Parent p1();
test(p1);
return ;
}

当且仅当对通过引用或者指针调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。
一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。
一个派生类的函数如果覆盖了某个继承而来的虚函数,那么它的参数类型必须与被它覆盖的基类函数完全一致。同样,返回类型也必须与基类匹配,该返回类型规则存在一个例外,当类的虚函数返回类型是类本身的指针或者引用时,该返回类型匹配一致规则无效。eg:如果B类由A类派生得到,则基类A的虚函数可以返回A*或者A&而派生类B对应的虚函数可以返回B*或者B&,但是这样的返回类型要求从B到A的类型是可以访问的。
c++之——派生类的同名成员和函数调用方式及构造析构顺序的更多相关文章
- 【c# 学习笔记】阻止派生类重写虚成员
使用sealed 关键字可以防止一个类被其他类继承.同样,也可以使用sealed关键字来阻止派生类重写虚成员.如,我们希望Horse的继承类不再具有扩展Voice方法的行为.(上一章链接:https: ...
- objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式
objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- python多继承中子类访问祖先类的同名成员
子类调用父类的同名成员 方式1: class A: def f_a(self): print("----A----") class B: def f_a(self): print( ...
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...
- c++中派生类对基类成员的三种访问规则(转)
C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...
- 【转载】C++中的基类与派生类
转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...
随机推荐
- 〖Ruby〗Ruby运算符/优先级
优先级 能否重写 运行符 描述 最高 Y [] []= 数组下标 数组元素赋值 Y ** 冥乘 Y ! ~ + - 非 位非 一元加 负号 Y * / % 乘 除 模 Y + - 加 减 Y > ...
- __str__被print函数调用,目的是打印类的内容到屏幕上
# -*- coding: utf-8 -*- #python 27 #xiaodeng #__str__被print函数调用,目的是打印类的内容到屏幕上 class APIError(): def ...
- java 关于操作Collection的一点说明
java 中有一个工具类 Collections 其中的一个方法 static <T> boolean replaceAll(List<T> list, T oldVal, T ...
- 解决python:'ascii' codec can't encode characters in position问题
今天把一个列表转换成字符串输出的时候出现了UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: or ...
- 关于highstock横坐标的一些的一些说明(1)使用UTC时间
highstock的数据格式采用的是[[时间,数据],[时间,数据],[时间,数据],[时间,数据]],而时间采用的是13位的毫秒值,如[1133136000000,69.66],采用的时间格式为UT ...
- HDUOJ-----2068RPG的错排
RPG的错排 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...
- C1控件的破解步骤
最近接触了一个系统中的打印和报表控件用到了C1控件,控件在以前就注册了的,可是在这次修改了系统后,系统却提示C1的控件没有注册. 怎么回事呢?我们这次并没有修改报表,而且也没有和C1控件相关的改动.怎 ...
- C# 获取当前打开的文件夹2
这一个则比较投机,准确性不能保证,可以参考: 这个类获取当前进程的句柄: public class MyProcess { private bool haveMainWi ...
- android 搜索自动匹配关键字并且标红
这个效果主要是为了着重表现搜索关键字的 . 1. 单关键字匹配 若只需匹配 搜索 ...