c++中基类和子类的成员变量同名

#include <iostream>

using namespace std;

class Base{
    public:
        Base(void):m_i(0){}
        Base(int i):m_i(i){}
        int m_i;
};                                                                                                                                     

class Derived:public Base{
    public:
        Derived(void):m_i(0){}
        Derived(int i,int j):Base(i),m_i(j){}
        Derived(const Derived& that):
            m_i(that.m_i),Base(that){}
        Derived& operator=(const Derived& that){
            if(&that != this){
                m_i = that.m_i;
                Base::operator=(that);
                //基类Base看似没有Base& operator=(const Base& that)
                //这个赋值拷贝函数,但是系统会为其添加一个
            }
        }
        int m_i;//覆盖了基类Base总的成员变量m_i.
};
int main(void){
    Derived d1(100,200);
    Derived d2(d1);
    //通过这样来访问基类中的同名成员变量.
    cout << d1.Base::m_i << ‘ ‘ <<d1.m_i << endl;//100,200
    cout << d2.Base::m_i << ‘ ‘ <<d2.m_i << endl;//100,200
    Derived d3;
    d3 = d1;
    cout << d3.Base::m_i << ‘ ‘ <<d3.m_i << endl;//100,200
    }
时间: 2024-10-31 03:05:00

c++中基类和子类的成员变量同名的相关文章

java中的类修饰符、成员变量修饰符、方法修饰符。

类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问. private(私有访问控制符)指定该变量只允许自己的类的方法

java中的类修饰符、成员变量修饰符、方法修饰符

类修饰符:  public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量 和 方法的访问权限

java面向对象学习之——java中的类修饰符、成员变量修饰符、方法修饰符

类修饰符: public(访问控制符)-->将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类.abstract-->将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现.final-->将一个类生命为最终(即非继承类),表示他不能被其他类继承.friendly-->默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符)-->指定该变量为公共的,他可以被任何对象的方法访问.private(私有访问控制符

关于基类和子类构造函数的问题

无意中看到一篇文章<关于基类和子类构造函数的问题>,来自:http://blog.sina.com.cn/s/blog_64d57e710100n24f.html 这时会报错: 但是运行: 仍然会输出结果: 这显然是说明虽然为a开辟了空间.构建了成员函数,但是a的数据没有初始化,a的数据是读取的随机数. Why? 再来看另外一种情况,如果在类A中添加了默认构造函数,然后再用来定义b: 就会正常输出结果,而不会报错: 这里虽然读取到的x的数据和上面的是一样的,但是两者的意义不同.前者是没有初始化

详解C++中基类与派生类的转换以及虚基类

很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生

关于C#基类和子类函数调用问题

c#基类子类的函数调用关系,代码说明newkeyword后面的类中的函数为对象调用的函数,当然必需要有virtual和override,继承就相当于包括了基类的函数,子类对象调用时基类的函数相当于就在子类其中一样.(必需要有virtual和override此代码才成立),问题是C#基础问题但非常easy搞错,代码片在unity3d中測试,需要UnityEngine.dll. using UnityEngine; using System.Collections; public class New

基类与子类之间的引用转换

(一) 从该源代码中可看出,子类可直接赋给基类(“基类变量=子类对象”):基类的引用类型要传递给子类必须通过强制转换(“子类变量=(子类名)基类对象”): 子类之间不可以进行转换. (二) 该源代码可总结出: 当基类与子类有同名的变量时,以引用变量为准,引用变量是谁,就调用哪个类的变量:当基类与子类有同名的方法时,以具体对象类型为准,对象是什么类型,就调用哪个类的方法:基类与子类之间的转换:基类变量可以直接引用子类对象,或者直接将子类对象赋给基类变量:但是基类对象要转换为子类变量时,就必须进行强

C++中基类虚析构函数的作用及其原理分析

虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏. 故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual. 知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual

UML表达基类,子类关系

1.UML图有如下几类: UML表达基类.子类关系步骤: 1.点击Diagram/class diagram创建类图. 2.选中工具栏的class图标,开始绘制类图 2.1双击可以修改类名 2.2双击方法可以修改方法名访问权限等 2.3 TestActivity继承 Activity