在派生类中对虚方法进行重载

先让我们回顾一下普通的方法重载。普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。

而对基类虚方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符。

还是让我们用汽车类的例子来说明多态性的实现。

程序清单14-4:

using System;
class Vehicle //定义汽车类
{
  public int wheels; //公有成员:轮子个数
  protected float weight; //保护成员:重量
  public Vehicle(int w,float g){
         wheels=w;
         weight=g;
  }
public virtual void Speak(){
       Console.WriteLine("the w vehicle is speaking!");
  }
};

class Car:Vehicle //定义轿车类
{
  int passengers; //私有成员:乘客数
  public Car(int w,float g,int p):base(w,g)
 {
         wheels=w;
         weight=g;
         passengers=p;
  }
 public override void Speak(){
      Console.WriteLine("The car is speaking:Di-di!");
   }
}

class Truck:Vehicle //定义卡车类
{
  int passengers; //私有成员:乘客数
  float load; //私有成员:载重量
  public Truck(int w,float g,int p,float l):base(w,g)
  {
     wheels=w;
     weight=g;
     passengers=p;
     load=l;
  }
  public override void Speak(){
     Console.WriteLine("The truck is speaking:Ba-ba!");
    }
}

class Test
{
  public static void Main(){
    Vehicle v1=new Vehicle();
    Car c1=new Car(4,2,5);
    Truck t1=new Truck(6,5,3,10);
    v1.Speak();
    v1=c1;
    v1.Speak();
    c1.Speak();
  v1=t1;
  v1.Speak();
     t1.Speak();
    }
}

分析上面的例子,我们可以看到:

●Vehicle类中的Speak方法被声明为虚方法,那么在派生类中就可以重新定义此方法。

●在派生类Car和Truck中分别重载了Speak方法,派生类中的方法原型和基类中的方法原型必须完全一致。

●在Test类中,创建了Vehicle类的实例v1,并且先后指向Car类的实例c1和Truck类的实例t1。

运行该程序,结果应该是:

The Vehicle is speaking!
The car is speaking:Di-di!
The Car is speaking:Di-di!
The truck is speaking:Ba-ba!
The truck is speaking:Ba-ba!

这里,Vehicle类的实例v1先后被赋予Car类的实例c1,以及Truck类的实例t1的值。在执行过程中,v1先后指代不同的类的实例,从而调用不同的版本。这里v1的Speak方法实现了多态性,并且v1.Speak()究竟执行哪个版本,不是在程序编译时确定的,而是在程序的动态运行时,根据v1某一时刻的指代类型来确定的,所以还体现了动态的多态性。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例
, float
, 方法
, public
, 多态性
, speak gain setting
, 成员
返回先后
派生类重载基类函数、派生类 函数重载、基类调用派生类虚函数、派生类 虚析构函数、虚函数重载,以便于您获取更多的相关知识。

时间: 2024-10-03 15:22:49

在派生类中对虚方法进行重载的相关文章

c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; Parent *p; public: Parent(){} Parent(int x){ this->x=x; p=this; } virtual void f(){ cout<<"Parent::f()"<<endl; } void g(){ cout&l

C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好?

问题描述 C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好? //brass.h -- bank account classes#ifndef BRASS_H_#define BRASS_H_#include //brass account classclass Brass{private: std::string fullName; //x姓名 long acctNum; //账号 double balance; //当前结余public: Brass(const std::strin

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

java-Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了!

问题描述 Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! 麻烦大家了 解决方案 直接作为参数传就是了 void f1() { int[] x = {1,2,3,4,5}; f2(x[1]); } void f2(int n) { } 解决方案二: Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题 解决方案三: 可以使用全局变量的方

替换NSString类中的stringWithFormat:方法

替换NSString类中的stringWithFormat:方法 先给出源码: YXUseful.h // // YXUseful.h // NSString // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h> NSString * String(NSString *format, ...); YXUseful.m // // YXUseful.m // NSStrin

java static-假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗

问题描述 假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗 假设下面这种情况,test1中的do方法会被初始化吗? public class test{ public static void main(string []args){ test1 t: } } class test1{ int i: static void do(){} } 解决方案 第一次访问的含义是,访问了这个静态类中的任何方法.属性.字段,那么所有的属性都会被初始化. 解决方案二: 方法

在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来

问题描述 在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来 #include using namespace std; class love{ public: char you() { int i=87, j=74 ,k=89; char a=char(i),b=char(j),c=char(k); return 0; } }; class Me:private love{ public: Me():l(a),u(b),n(c){} char const l,u,

调用方法-怎么用一个对象调用另一个类中对象的方法

问题描述 怎么用一个对象调用另一个类中对象的方法 怎么用一个对象调用另一个类中对象的方法 比如一个类A ,一个类B,B里面有个方法show(),在main中A a=new A();B b=new B();在A中没有调用B方法的情况下,我想通过a调用B中的show()方法,该怎么实现.初学者,求大神给我指导下,不知道我表达的是否准确 解决方案 首先,确认下你是想在A类的某个方法中调用B类的方法吗?如果是的话,A必须依赖B,依赖方法可以是A类关联一个B类的成员变量,示例代码: public clas