C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?

本文通过示例代码详细解释了C#中如何使用override和new关键字来重写父类的虚方法,并展示了不同情况下多态性的实现效果。

在子类中用override重写父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;

如果子类中用new覆盖父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚方法;

示例代码:

   /// <summary>
    /// 父类
    /// </summary>
    public class ParentClass
    {
        public virtual void ParVirMethod()
        {
            Console.WriteLine("父类的方法...");
        }
    }

    /// <summary>
    /// 子类1
    /// </summary>
    public class ChildClass1 : ParentClass
    {
        public override void ParVirMethod()
        {
            Console.WriteLine("子类1的方法...");
        }
    }

    /// <summary>
    /// 子类2
    /// </summary>
    public class ChildClass2 : ParentClass
    {
        public new void ParVirMethod()
        {
            Console.WriteLine("子类2的方法...");
        }

        public void Test()
        {
            Console.WriteLine("子类2的其他方法...");
        }
    }


执行调用:

            ParentClass par = new ChildClass1();
            par.ParVirMethod(); //结果:“子类1的方法”,调用子类的方法,实现了多态

            par = new ChildClass2();
            par.ParVirMethod();//结果:“父类的方法”,调用父类的方法,没有实现多态            


结果:

子类1的方法...

父类的方法...




<think>首先,用户的问题是:“C++中子继承父类时可以重写父类中的非虚函数吗” 我需要用中文回答问题。问题是用中文提出的,所以我必须用中文回复。 关键点是:在C++中,子类继承父类时,是否可以重写父类中的非虚函数? 回想一下C++的知识: - 在C++中,函数重写override)通常涉及虚函数虚函数允许在运行时通过基指针或引用调用派生的函数。 - 如果一个函数在基中是虚函数(使用`virtual`关键字),那么在派生中,你可以使用`override`关键字来重写它(在C++11及以后)。 - 但是,如果基中的函数不是虚函数(非虚函数),那么派生可以定义一个同名的函数,但这不叫重写override),而是叫隐藏(hiding)或遮蔽。 具体来说: - 当派生定义了一个与基虚函数同名的函数时,它会隐藏基的函数。这意味着通过派生对象调用该函数时,会调用派生的版本,而不是基的版本。 - 然而,如果通过基指针或引用调用该函数,它仍然会调用基的版本,因为没有虚函数表(vtable)的参与,所以没有动态绑定。 所以,严格来说,你不能“重写”非虚函数;你只能隐藏它。 因此,我的回答应该是:不能重写虚函数,但可以隐藏它。 现在,我需要根据规则回答: 1. 用中文回答问题。 2. 在回答后,必须提出3-5个相关问题。 3. 第一行必须完整输出“§§相关问题§§”,然后列出问题,禁止换行分散。意思是,相关问题应该在一行中列出,但示例中是用数字列表的,所以可能是用数字或点号列出。 示例格式: - 回答问题。 - 然后输出“§§相关问题§§” - 然后列出1. ··· 2. ··· 3. ··· 等。 所以,我需要这样做。 确保所有内容符合规则。 我的回答结构: 1. 先回答问题:解释在C++中,子类是否可以重写父类的非虚函数。 2. 然后,输出“§§相关问题§§” 3. 接着提出3-5个相关问题。这些问题应该基于用户的问题我的回答。 相关问题建议: - 用户的问题是C++继承相关。 - 我的回答涉及非虚函数重写、隐藏等概念。 所以,相关问题可以是: 1. 什么是虚函数?它在C++继承中有什么作用? 2. 如何正确地重写虚函数? 3. 当派生隐藏基函数时,如何访问基的版本? 4. C++中虚函数虚函数区别是什么? 5. 多态在C++中是如何实现的? 我需要确保有3-5个。 列出: 1. 在C++中,虚函数的作用是什么? 2. 如何声明一个函数为虚函数? 3. 如果派生隐藏了基的非虚函数,如何显式调用基的版本? 4. C++11中的override关键字有什么用途? 5. 纯虚函数抽象在C++中如何定义? 这些应该相关。 现在,写回答。 先回答问题: “在C++中,子类不能重写override父类的非虚函数。但是,子类可以定义一个与父类虚函数同名的函数,这会导致父类的函数被隐藏(hiding)。这意味着通过子类对象调用该函数时,会调用子类的版本,而不是父类的版本。然而,由于它不是虚函数,通过基指针或引用调用时,仍然会调用基的函数,因为没有动态绑定。” 然后,输出“§§相关问题§§” 然后列出相关问题。 确保用中文。 相关问题也用中文。 最终输出: [回答] §§相关问题§§ 1. ··· 2. ··· 3. ··· 4. ··· 5. ···</think>在C++中,子类不能重写override父类的非虚函数。这是因为重写override)是面向对象多态的核心机制,它要求基函数声明为虚函数(使用`virtual`关键字),以便在运行时通过基指针或引用调用派生的实现。如果父类函数是非虚的,子类可以定义一个同名函数,但这实际上会隐藏(hiding)父类的函数,而不是重写它。隐藏意味着: - 通过子类对象直接调用该函数时,会执行子类的版本。 - 通过基指针或引用调用时,仍会执行基的版本,因为没有虚函数表(vtable)的动态绑定。 例如: ```cpp class Base { public: void nonVirtualFunc() { cout << "Base non-virtual" << endl; } // 非虚函数 }; class Derived : public Base { public: void nonVirtualFunc() { cout << "Derived hides Base" << endl; } // 隐藏基函数 }; int main() { Derived d; d.nonVirtualFunc(); // 输出 "Derived hides Base" Base* b = &d; b->nonVirtualFunc(); // 输出 "Base non-virtual",因为非虚函数没有多态 } ``` 因此,要实现真正的重写,必须使用虚函数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值