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()를 제거하면 더 이상 작동하지 않습니다. 출력은 "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;
}
이의 나의 이해 가상 기능을 갖는 것은 vtable을 가리키는 객체에 vptr에서을 추가 컴파일러가 있다는 것입니다. vtable에는 호출 할 올바른 함수의 주소가 포함됩니다 (Derived :: f()) - (객체의 유형 정보와 마찬가지로)
이제 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());
}
}
내 질문은 따라서이다 : 여기서, "파생" "자료"및 2 C와 유사한 빈 클래스 ++ 예제는 기본적으로있는 것은 일부 올바른 ++은 C에 대한 이해, 그리고 어떻게 C#을 제대로 식별하기 위해 관리 않습니다 C++이 없을 때 객체의 타입?
이 기사는 C#의 배경에서 이것이 어떻게 구현되는지 이해하는 데 도움이 될 것입니다. http://msdn.microsoft.com/ko-kr/magazine/cc163791.aspx - 개체 레이아웃 섹션을 참조하십시오. –