我有些困惑,不太理解是什么导致了C++和C#之间的差异。
首先,我们有一个例子,其中基类包含一个虚函数。
这个例子的输出是“Derived”,符合预期。
如果我们去掉f(),它就不再起作用了。输出为“Base”。例如:
我的理解是,定义虚函数会导致编译器在对象中添加一个vptr指针,该指针指向虚函数表。虚函数表包含正确调用函数(Derived::f())的地址 - (以及对象的类型信息?)
现在来看和C#的比较。在这里,“Base”和“Derived”基本上是类似于第二个C++示例的空类:
我的问题是:我的C++理解是否正确,而C#如何在C++无法识别对象类型时正确识别对象类型?
首先,我们有一个例子,其中基类包含一个虚函数。
class Base
{
protected:
int super;
public:
virtual int f() = 0;
};
class Derived : public Base
{
public:
int extraA;
int f(){ return 1; }
};
int main()
{
Derived *d = new Derived();
std::vector<Base*> v;
v.push_back(d);
for(int i=0; i < v.size() ;i++)
{
// Output "Derived"
std::cout << typeid(*v[i]).name() << std::endl;
}
return 0;
}
这个例子的输出是“Derived”,符合预期。
如果我们去掉f(),它就不再起作用了。输出为“Base”。例如:
class Base
{
protected:
int super;
};
class Derived : public Base
{
public:
int extraA;
};
int main()
{
Derived *d = new Derived();
std::vector<Base*> v;
v.push_back(d);
for(int i=0;i<v.size();i++)
{
// Output "Base"
std::cout << typeid(*v[i]).name() << std::endl;
}
return 0;
}
我的理解是,定义虚函数会导致编译器在对象中添加一个vptr指针,该指针指向虚函数表。虚函数表包含正确调用函数(Derived::f())的地址 - (以及对象的类型信息?)
现在来看和C#的比较。在这里,“Base”和“Derived”基本上是类似于第二个C++示例的空类:
public static void Main()
{
Derived d = new Derived();
IList<Base> v = new List<Base>();
mList.Add(d);
for (int i = 0; i < v.Count; i++)
{
// Output: "Derived"
System.Console.WriteLine(v.ElementAt(i).GetType());
}
}
我的问题是:我的C++理解是否正确,而C#如何在C++无法识别对象类型时正确识别对象类型?