基类虚方法的重载

kdymh 2008-04-13 11:32:43
using System;
using System.Collections.Generic;
using System.Text;

namespace Test1
{
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)
{
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)
{
passengers = p;
load = l;
}
public override void Speak()
{
Console.WriteLine("The truck is speaking:Ba-ba!");
}
}
class Test1
{
public static void Main()
{
Vehicle v1 = new Vehicle(2, 3);
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();
Console.ReadKey();
}
}
}

上面的代码中

public Truck(int w, float g, int p, float l): base(w, g)

为什么要接上基类base(w, g)??
...全文
129 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kdymh 2008-04-15
  • 打赏
  • 举报
回复
谢谢大家的关注,同时也明白了
kdymh 2008-04-14
  • 打赏
  • 举报
回复
也就是说在显示调用基类时,它所先运行基类 public car(int w, float g, int p)
接着运行public Vehicle(int w, float g)
如果没有显示调用,则只运行 public Vehicle(int w, float g)
是不是啊???

Ivony 2008-04-14
  • 打赏
  • 举报
回复
完全没有看到与虚方法或者重载有任何关系
lake_cx 2008-04-14
  • 打赏
  • 举报
回复
你就想成跟这个一个意思吧
public car(int w, float g, int p)
{
Vehicle(w, g);//虽然不能这么写
passengers = p;

}
dancingbit 2008-04-14
  • 打赏
  • 举报
回复
显式调用基类的构造函数,创建的就是基类的实例了。
kdymh 2008-04-14
  • 打赏
  • 举报
回复
如果没有显示调用基类的构造函数

public Truck(int w, float g, int p, float l): base(w, g)
改为
public Truck(int w, float g, int p, float l)
行运时也会调用基类的构造函数

public Vehicle(int w, float g)
{
wheels = w;
weight = g;
}
TNT_1st_excellence 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dancingbit 的回复:]
在父类定义的私有成员,在派生类中无法访问,只能由父类的构造函数来初始化,以这样的方式调用父类的构造函数,就可以完成这个工作。
[/Quote]
JYYCOM 2008-04-14
  • 打赏
  • 举报
回复
学习了!
milizi820 2008-04-14
  • 打赏
  • 举报
回复
调用基类的构造函数,不写也会调用的,构造顺序就是先调用基类的构造函数
但是你的这个程序不写就报错了,因为你的基类没有提供无参的默认构造函数,不写的话就是调用默认的无参构造函数,可是你的基类没有提供(写了有参的构造函数,默认无参构造函数就不存在了,需要手动添加),所以就报错了。下面的这个程序也可以运行。


milizi820 2008-04-14
  • 打赏
  • 举报
回复
virus 解释得很清楚了
milizi820 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kdymh 的回复:]
也就是说在显示调用基类时,它所先运行基类 public car(int w, float g, int p)
接着运行public Vehicle(int w, float g)
如果没有显示调用,则只运行 public Vehicle(int w, float g)
是不是啊???
[/Quote]
在这里没有显示调用,也会运行public Vehicle(int w, float g)吧
JYYCOM 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kdymh 的回复:]
也就是说在显示调用基类时,它所先运行基类 public car(int w, float g, int p)
接着运行public Vehicle(int w, float g)
如果没有显示调用,则只运行 public Vehicle(int w, float g)
是不是啊???
[/Quote]
我的理解是:
应该都是先执行基类的构造函数,如果子类构造函数重载了基类构造函数,并且其中有参数的话,基类构造函数的参数是通过子类构造函数的参数传递过去的。
我也是初学者,不知道这么理解对不对,大家指正
virusswb 2008-04-14
  • 打赏
  • 举报
回复
本来写不写: base(w, g) 是没有关系的,就是调用基类的构造函数,不写也会调用的,构造顺序就是先调用基类的构造函数
但是你的这个程序不写就报错了,因为你的基类没有提供无参的默认构造函数,不写的话就是调用默认的无参构造函数,可是你的基类没有提供(写了有参的构造函数,默认无参构造函数就不存在了,需要手动添加),所以就报错了。下面的这个程序也可以运行。
using System;
using System.Collections.Generic;
using System.Text;

namespace Test1
{
class Vehicle
{
public int wheels;
protected float weight;
public Vehicle() { }
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)

{
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)

{
passengers = p;
load = l;
}
public override void Speak()
{
Console.WriteLine("The truck is speaking:Ba-ba!");
}
}
class Test1
{
public static void Main()
{
Vehicle v1 = new Vehicle(2, 3);
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();
Console.ReadKey();
}
}
}
dancingbit 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kdymh 的回复:]
也就是说在显示调用基类时,它所先运行基类 public car(int w, float g, int p)
接着运行public Vehicle(int w, float g)
如果没有显示调用,则只运行 public Vehicle(int w, float g)
是不是啊???
[/Quote]
错了。
不慕沙卡拉卡 2008-04-14
  • 打赏
  • 举报
回复
base关键字用于从派生类中访问基类成员
public Truck(int w, float g, int p, float l): base(w, g)
表示显式调用父类的构造函数
运行是将先执行父类构造函数,然后才执行子类构造函数的主题
cc_net 2008-04-14
  • 打赏
  • 举报
回复

public car(int w, float g, int p)
: base(w, g)
{
passengers = p;

}


调用了基类的构造函数来构造w,g.
自己只需要写代码构造p

代码重用撒
dancingbit 2008-04-13
  • 打赏
  • 举报
回复
在父类定义的私有成员,在派生类中无法访问,只能由父类的构造函数来初始化,以这样的方式调用父类的构造函数,就可以完成这个工作。
liurui1985 2008-04-13
  • 打赏
  • 举报
回复
调用父类的构造函数

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧