C#对私有成员的继承

今天工作不是很忙,使得有些空闲时间,看了下以前的学习笔记,又看到C#继承这一块的内容,虽然早就知道C#中的继承是可以继承私有成员的,但却一直没有深入剖析其中的原理,今天就深入的研究了一下。

首先采用反射的方式来获取,但是一点结果都没有,然后查了一些资料,了解到VMT(虚拟方法表)的概念,这里也不做陈述,改装了一个别人的例子来查看:

using System;
class Base
{
    private int flag = 1;
    public int GetNum(Child c)
    {
        return c.flag;
    }

    public int GetNum(Base b)
    {
        return b.flag;
    }

    public Base()
    { }

    public Base(int flag)
    {
        this.flag = flag;
    }
}

class Child : Base
{
    private int flag = 2;
    public new int GetNum(Child c)
    {
        return c.flag;
    }

    public Child(int flag)
        : base(flag)
    {
        this.flag = 3;
    }
}

class test
{
    public static void Main()
    {

        Base b = new Base();
        Child c = new Child(4);
        Console.WriteLine(b.GetNum(c));
        Console.WriteLine(c.GetNum(c));
        Console.WriteLine(b.GetNum((Base)c));
    }
}

这里的运行结果是4,3,4.

为什么会是这样呢,可以分析一下:

Main函数中

 Base b = new Base();
Child c = new Child(4); 

这两句话执行后 b,c的内存结构不做陈述了,

Console.WriteLine(b.GetNum(c));

执行时会调用Base类的GetNum(Child c)的重载,此时Base类不能获取到Chlid的私有变量,所以输出Child在父类中继承的flag值为4(构造函数中base(flag)改为4的),此时已经可以证明私有字段被子类继承了。

执行

Console.WriteLine(c.GetNum(c));

得到结果3,这里的就需要不分析了

执行

Console.WriteLine(b.GetNum((Base)c));

得到4也充分证明了私有字段被子类继承了。

这里也可以监视一下c的地址,看一下整个输出过程是不是同一个对象:

时间: 2024-07-31 04:49:32

C#对私有成员的继承的相关文章

有关java中私有成员能否被继承的问题

写程序中,无意中想到这个问题,随手搜了一下,发现大家对这个问题的看法不一 先看一下官方文档 http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html What You Can Do in a Subclass A subclass inherits all of the public and protected members of its parent, no matter what package the subcla

类的三种成员与继承

对于类而言,一共有三种成员类型,分别为private,protected,public.其中,如果数据成员的类型为private,可以默认不写.对于在类外使用的情况,private和protected是一致的,均不可以由外部直接访问,而public所包含的成员是可以由外部直接访问的.下面给出一个基本的例子. 12345678910111213141516171819202122 class Time { private: int hour; int minute; protected: int

私有成员变量可以被子类继承吗

今天看spring源码,不经意间发现了一问题:在一个抽象类中定义了一个私有成员变量. 仔细想想:抽象类不能被实例化的,只能被子类继承.但是自从学java的继承只有,我们就知道,子类不能继承父类的私有成员变量或方法的. 问题:在该抽象方法中定义这个私有变量有什么用呢?或者说这个私有成员变量再什么地方用得到呢? 所以自己做了一个测试如下: public abstract class Fatherclass { private int privatenumber; public int getPriv

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

C++公有、私有、保护继承的关系

公有继承(public).私有继承(private).保护继承(protected)是C++三种继承方式. 公有继承(public) 公有继承(public)的特点是基类的公有成员(public)和保护成员(protected)作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有(public)的,不能被这个派生类的子类所访问. 私有继承(private) 私有继承(private)的特点是基类的公有成员(public)和保护成员(protected)都作为派生类的私有成员(pr

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

JavaScript 私有成员

Class field declarations for JavaScript(JavaScript 类的字段声明)目前已经进入了 stage-3,其中包含一项 OOP 开发者都很关注的内容:Private fields.JavaScript 一直没有私有成员并不是没有原因,所以这一提议给 JavaScript 带来了新的挑战.但同时,JavaScript 在 ES2015 发布的时候已经在考虑私有化的问题了,所以要实现私有成员也并非毫无基础. 笔者在专栏<JavaScript 全栈工程师养成记

通过反射访问父类的私有成员

Java语言中,子类是不能访问父类的私有成员的,包括成员变量和方法,但可以通过Java的反射机制去访问. 其实在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用.就像有些东西你可能拥有,但是你并不能使用.所以子类对象是绝对大于父类对象的,所谓的子类

通过指针访问C++对象的私有成员

C++对象的私有成员是禁止类外的访问的.但是我们仍然可以通过指针访问C++对象的私有成员. #include <iostream> using namespace std; class A { public: A(int i = 0) :m_i(i) {} void print() { cout << "m_i" << this->m_i << endl; } private: int m_i; }; int main(int ar