C++继承时子类定义同名成员变量时的调用继承函数的问题
2015-03-26 14:39
706 查看
代码如下:
输出结果是0,1。而不是1,1。为什么不同呢?
解释:
因为在继承的时候,允许子类存在与父类同名的成员变量,但是并不覆盖父类的成员变量,他们同时存在。
首先在base里面有一个 a 变量,然后在simple里面又有一个 a 变量。在孩子类创建对象时,会先调用父类的构造函数,先为父类的 a 变量初始化,然后调用孩子类的构造函数来初始化自己的变量,因为给孩子类中没有定义print函数,所以会按照就近原则去寻找父类中是否有print函数。恰好父类中有这个函数,于是调用父类的print函数b.print(),而这个函数会调用父类的a变量。
b.a就就近调用孩子类的a变量。
按照就近原则调用,如果自己的类中定义了接口就调用自己的,如果没有就去父类、祖父类....... 去找,然后调用。
#include<iostream> using namespace std; class Base { public: int a; Base() { a=0; cout<<"I`m base Begin"<<endl; } int Print() { cout<<a<<endl; return 1; } ~Base() { cout<<"I`m base End"<<endl; } }; class Simple: public Base { public: int a; Simple() { a=1; cout<<"I`m Simple Begin"<<endl; } ~Simple() { cout<<"I`m Simple End"<<endl; } /** void Print() { cout<<a<<endl; } */ }; main() { Simple b; b.Print(); cout<<b.a<<endl; }
输出结果是0,1。而不是1,1。为什么不同呢?
解释:
因为在继承的时候,允许子类存在与父类同名的成员变量,但是并不覆盖父类的成员变量,他们同时存在。
首先在base里面有一个 a 变量,然后在simple里面又有一个 a 变量。在孩子类创建对象时,会先调用父类的构造函数,先为父类的 a 变量初始化,然后调用孩子类的构造函数来初始化自己的变量,因为给孩子类中没有定义print函数,所以会按照就近原则去寻找父类中是否有print函数。恰好父类中有这个函数,于是调用父类的print函数b.print(),而这个函数会调用父类的a变量。
b.a就就近调用孩子类的a变量。
按照就近原则调用,如果自己的类中定义了接口就调用自己的,如果没有就去父类、祖父类....... 去找,然后调用。
相关文章推荐
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类父类同名成员变量的问题
- 黑马程序员——声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用时输出:我叫***,今年***岁了。声明类Chinese继承Person
- [C++] 关于子类声明与父类同名同类型的成员变量的问题
- c++中基类和子类的成员变量同名,成员函数也同名
- C++学习笔记:3.3.5 继承中的同名成员变量和函数
- C++ 子类和父类同名成员变量或函数
- 黑马程序员—声明类Person,包含2个成员变量:name、age。定义函数sayHello(), * 调用时输出:我叫***,今年***岁了。声明类Chinese继承Person。
- c++ 父类指针转换为子类指针后调用子类的成员函数问题
- c++中 static 变量和函数能否被子类继承
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.
- 在c++中,静态数据成员可以被非静态成员函数调用吗?如果可以调用的话那为什么还要定义静态成员函数呢
- 定义一个包含私有成员变量和函数的类,再定义一个内部类,在内部类函数中访问外部成员变量,并调用外部函数。在外部类函数中创建内部类对象,调用内部类函数
- C++中线程函数中方访问成员变量的问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- 关于c++多重继承下的函数调用注意的问题
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- C++第三周任务3请在原类基础上,增加成员函数,要求前三个设计成内置函数,在main()数中增加适当的调用以展示扩充类定义后的功能(最好能一次运行)。
- C++继承中覆盖和隐藏基类成员变量或成员函数