实现多态的几种方法

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。

可以用不同的方式实现组件中的多态性:

  • 接口多态性。
  • 继承多态性。
  • 通过抽象类实现的多态性。

 

 
1.利用继承,让派生类来重写父类的方法

class Program
    {
        static void Main(string[] args)
        {
            Anmial a1 = new Anmial();
            Dog d1 = new Dog();
            Anmial da = new Dog();

            List<Anmial> list = new List<Anmial>();
            list.Add(a1);
            list.Add(d1);
            list.Add(da);
            foreach(Anmial a in list)
            {
                a.Say();
            }
            Console.ReadKey();
        }
    }

    class Anmial
    {
        public virtual void Say()
        {
            Console.WriteLine("Anmial Say");
        }
        
    }

    class Dog : Anmial
    {
        public override void Say()
        {
            Console.WriteLine("Dog Say");
        }
    }

    class Mouse : Anmial
    {

        public override void Say()
        {
            Console.WriteLine("Mouse Say");
        }
    }






   class Cat:Anmial




     {






       //........没有重写方法的时候,调用的是父类的方法,(因为是继承了父类的方法)
     }

运行结果:
Anmial Say
Dog Say
Dog Say

2.抽象类的抽象方法实现多态

 class Program
    {
        static void Main(string[] args)
        {
            Anmial a1 = new Cat();
            Anmial d1 = new Dog();
           
            List<Anmial> list = new List<Anmial>();
            list.Add(a1);
            list.Add(d1);

            foreach (var a in list)
            {
                a.Say();
            }
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 抽象类中只能声明,方法,属性,索引器,字段等,不能被实例化
    /// </summary>
    public abstract class Anmial
    {
        public void Fly()
        {
            Console.WriteLine("飞");
        }
        public abstract void Say();//抽象方法,没有方法的实现体
    }

    class Cat:Anmial
    {

        public override void Say()
        {
            Console.WriteLine("猫叫");
        }
    }

    class Dog : Anmial
    {
        public override void Say()
        {
            Console.WriteLine("狗叫");
        }
    }

3.接口实现多态

class Program
    {
        static void Main(string[] args)
        {
            Anmial a1 = new Dog();
            Anmial c1 = new Cat();
            List<Anmial> list = new List<Anmial>();
            list.Add(a1);
            list.Add(c1);
            foreach(var a in list)
            {
                a.Say();
            }
            Console.ReadKey();
        }
    }
    interface Anmial
    {
        void Say();
    }

    class Dog : Anmial
    {
        #region Anmial 成员

        public void Say()
        {
            Console.WriteLine("狗叫");
        }

        #endregion
    }

    class Cat : Anmial
    {
        #region Anmial 成员

        public void Say()
        {
            Console.WriteLine("猫叫");
        }

        #endregion
    }


这三种方式实现多态有那些区别呢?

//接口多定义对象行为,抽象类定义对象属性

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以通过以下几种方式来实现多态: 1. 虚函数(virtual functions):在基类中声明虚函数,并在派生类中重写这些虚函数。通过基类指针或引用调用虚函数时,实际上会调用派生类中重写的函数。 例如: ```cpp class Base { public: virtual void func() { cout << "Base::func()" << endl; } }; class Derived : public Base { public: void func() override { cout << "Derived::func()" << endl; } }; int main() { Base* ptr = new Derived(); ptr->func(); // 输出:Derived::func() delete ptr; return 0; } ``` 2. 纯虚函数(pure virtual functions)和抽象类(abstract class):在基类中声明纯虚函数,即函数没有实现,派生类必须重写这些纯虚函数才能被实例化。基类中包含至少一个纯虚函数的类称为抽象类,不能直接创建抽象类的对象。 例如: ```cpp class Shape { public: virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle" << endl; } }; int main() { Shape* shape = new Circle(); shape->draw(); // 输出:Drawing a circle delete shape; return 0; } ``` 3. 虚析构函数(virtual destructor):当基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么在销毁对象时只会调用基类的析构函数,而不会调用派生类的析构函数。为了正确释放派生类对象的资源,应将基类的析构函数声明为虚函数。 例如: ```cpp class Base { public: virtual ~Base() { cout << "Base destructor" << endl; } }; class Derived : public Base { public: ~Derived() override { cout << "Derived destructor" << endl; } }; int main() { Base* ptr = new Derived(); delete ptr; // 输出:Derived destructor return 0; } ``` 通过使用虚函数、纯虚函数和虚析构函数,可以实现多态性,使得程序能够根据对象的实际类型来调用相应的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值