C++とC#の違いを理解するのに問題があります。C#vs C++ - 型、継承、vtable
まず、基本クラスに仮想関数が含まれている例があります。
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;
}
この出力は、期待どおりに「派生」です。
f()を削除しても機能しなくなりました。出力は「ベース」です。例:これの
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;
}
私の理解では、仮想関数を持つことがvtableのを指すオブジェクトにvptrを追加するために、コンパイラを引き起こすこと、です。 vtableには正しい関数のアドレスが含まれています(Derived :: f()) - (オブジェクトの型情報と同様に)
ここで興味深いのはC#との比較です。ここで、「基本」と「派生」は、基本的に第二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++がないときのオブジェクトの型?
この記事は、これがC#の背後でどのように実装されているかを理解するのに役立ちます。http://msdn.microsoft.com/en-us/magazine/cc163791.aspx - オブジェクトレイアウトに関するセクションを参照してください。 –