#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++之——派生类的同名成员和函数调用方式及构造析构顺序的更多相关文章

  1. 【c# 学习笔记】阻止派生类重写虚成员

    使用sealed 关键字可以防止一个类被其他类继承.同样,也可以使用sealed关键字来阻止派生类重写虚成员.如,我们希望Horse的继承类不再具有扩展Voice方法的行为.(上一章链接:https: ...

  2. objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式

    objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令  的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...

  3. C++中的类继承(2)派生类的默认成员函数

    在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...

  4. python多继承中子类访问祖先类的同名成员

    子类调用父类的同名成员 方式1: class A: def f_a(self): print("----A----") class B: def f_a(self): print( ...

  5. C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)

    4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)

    在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...

  8. c++中派生类对基类成员的三种访问规则(转)

    C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...

  9. 【转载】C++中的基类与派生类

    转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...

随机推荐

  1. org.apache.commons.lang.StringUtils中isEmpty和isBlank的区别

    public static boolean isEmpty(String str) 判断某字符串是否为空,为空的标准是str==null或str.length()==0 StringUtils.isE ...

  2. OpenWrt的开机启动服务(init scripts)

    参考 https://wiki.openwrt.org/doc/techref/initscripts 以一个简单的例子来说明 #!/bin/sh /etc/rc.common # Example s ...

  3. zabbix监控redis连接情况

    配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加  Include=/etc/zabbix/zabbix_agentd.d/ 添加脚本对red ...

  4. Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...

  5. Android干坏事——禁止设备休眠

    实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位.具体如下: 1.在Manifest.xml文件里面用user-permis ...

  6. NuGet学习笔记(1) 初识NuGet及快速安装使用[转]

    来自:http://www.cnblogs.com/lzrabbit/archive/2012/05/01/2477607.html 关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学 ...

  7. [Creating an image format with an unknown type is an error] on cordova, ios 10

    在 iOS 10  调用 了 获取  相册的 可编辑 的  照片后,会出现 [Creating an image format with an unknown type is an error] 这个 ...

  8. iOS - TouchLock 手势锁

    1.绘制手势锁 具体实现代码见 GitHub 源码 QExtension QTouchLockView.h @interface QTouchLockView : UIView /// 提示信息框 @ ...

  9. python学习笔记——多进程中共享内存Value & Array

    1 共享内存 基本特点: (1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝. (2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将 ...

  10. jdbc与odbc的差别,感悟,学习。。。

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可訪问各类关系数据库.JDBC也是jav ...