您不想在构造函数中调用虚方法的原因是它们不会从基类的构造函数中调用。换句话说,如果要实例化派生类,则需要在其构造函数中显式调用虚拟方法的派生类实现。
所以你的虚拟方法不会是虚拟的。
以下是C++ FAQ中转码为 C# 的示例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VirtualMethodCalledFromConstructor
{
class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
Console.ReadLine();
}
}
public class Base
{
public Base()
{
Console.WriteLine("Base::Base()");
virt();
}
public virtual void virt()
{
Console.WriteLine("Base::virt()");
}
}
public class Derived : Base
{
public Derived()
{
Console.WriteLine("Derived::Derived()");
virt();
}
public virtual void virt()
{
Console.WriteLine("Derived::virt()");
}
}
}
这会在控制台中产生以下输出:
Base::Base()
Base::virt() // <--- not Derived::virt()
Derived::Derived()
Derived::virt()
请注意,仅调用“Derived::virt()”是因为 Derived 构造函数显式调用了它。