http://milaneze.com.br/post/2009/05/24/C-Heranca.aspx
Antes de mais nada, existem alguns pontos importantes sobre herança em C#:
1 - Toda classe é derivada da classe object e a classe object é a única que não é derivada de nenhuma outra classe;
2 - C# não tem herança múltipla;
3 - O construtor de uma classe derivada sempre chama o construtor da classe base explícita ou implicitamente e depois executa seu código;
4 - O access modifier protected é usado para tornar a variável de uma determinada classe acessível somente pelas classes derivadas dela;
5 - Para sobrepôr um método de uma classe base em uma classe derivada, esse método precisa ter, depois do access modifier, a palavra-chave override e o método na classe base deve ter, por exemplo, a palavra-chave virtual.
O exemplo abaixo é mais um baseado no livro do Deitel.
Classe base:
1: class EmpregadoComissionado
2: {3: private string nome;
4: private string sobrenome;
5: private string rg;
6: private double vendas;
7: private double comissao;
8: 9: public string Nome
10: { 11: get 12: {13: return nome;
14: } 15: 16: private set
17: {18: nome = value;
19: } 20: } 21: 22: public string Sobrenome
23: { 24: get 25: {26: return sobrenome;
27: } 28: 29: private set
30: {31: sobrenome = value;
32: } 33: } 34: 35: public string RG
36: { 37: get 38: {39: return rg;
40: } 41: 42: private set
43: {44: rg = value;
45: } 46: } 47: 48: public double Vendas
49: { 50: get 51: {52: return vendas;
53: } 54: 55: private set
56: {57: vendas = (value <= 0) ? 0 : value;
58: } 59: } 60: 61: public double Comissao
62: { 63: get 64: {65: return comissao;
66: } 67: 68: private set
69: {70: comissao = (value <= 0 value >= 100) ? 0 : value;
71: } 72: } 73: 74: 75: public virtual double SalarioGanho()
76: {77: return Comissao * Vendas;
78: } 79: 80: public EmpregadoComissionado(string Nome, string Sobrenome, string RG, double Vendas, double Comissao)
81: {82: this.Nome = Nome;
83: this.Sobrenome = Sobrenome;
84: this.RG = RG;
85: this.Vendas = Vendas;
86: this.Comissao = Comissao;
87: } 88: }1: class EmpregadoComissionadoMaisSalarioBase : EmpregadoComissionado
2: {3: private double salarioBase;
4: 5: public double SalarioBase
6: { 7: get 8: {9: return salarioBase;
10: } 11: 12: private set
13: {14: salarioBase = (value <= 0) ? 0 : value;
15: } 16: } 17: 18: 19: public override double SalarioGanho()
20: {21: return base.SalarioGanho() + SalarioBase;
22: } 23: 24: 25: public EmpregadoComissionadoMaisSalarioBase(string Nome, string Sobrenome, string RG, double Vendas, double Comissao, double Salario) : base(Nome, Sobrenome, RG, Vendas, Comissao)
26: {27: this.SalarioBase = Salario;
28: } 29: }Aplicação das classes:
1: class Program
2: {3: static void Main(string[] args)
4: {5: EmpregadoComissionado empregado1 = new EmpregadoComissionado("Jorge", "Silveira", "23333334", 250000, 0.10);
6: 7: Console.WriteLine("Empregado 1 - Comissionado");
8: Console.WriteLine("Nome: " + empregado1.Nome);
9: Console.WriteLine("Sobrenome: " + empregado1.Sobrenome);
10: Console.WriteLine("RG: " + empregado1.RG);
11: Console.WriteLine("Valor das vendas: " + empregado1.Vendas.ToString());
12: Console.WriteLine("% de comissão: " + empregado1.Comissao.ToString());
13: Console.WriteLine("Salário total: " + empregado1.SalarioGanho().ToString());
14: 15: 16: EmpregadoComissionadoMaisSalarioBase empregado2 = new EmpregadoComissionadoMaisSalarioBase("Carlos", "Franco", "764840392", 170430, 0.05, 3500);
17: 18: Console.WriteLine("\n\nEmpregado 2 - Comissionado + Assalariado");
19: Console.WriteLine("Nome: " + empregado2.Nome);
20: Console.WriteLine("Sobrenome: " + empregado2.Sobrenome);
21: Console.WriteLine("RG: " + empregado2.RG);
22: Console.WriteLine("Valor das vendas: " + empregado2.Vendas.ToString());
23: Console.WriteLine("% de comissão: " + empregado2.Comissao.ToString());
24: Console.WriteLine("Salário base: " + empregado2.SalarioBase.ToString());
25: Console.WriteLine("Salário total: " + empregado2.SalarioGanho().ToString());
26: 27: 28: Console.ReadLine(); 29: } 30: }