C#和C++中VIRTUAL函数的编译器行为差异.这是我在面试中被问到的

uda*_*day 7 c# c++ virtual

虚拟化在C++和c#中有何不同?基本上我想知道Vtable在C#和c ++中表示的方式有什么不同吗?编译器在C#和c ++中创建V表的方式也有区别吗?

基本上,面试官想知道在C#和c ++的情况下,虚函数的编译器行为如何不同.

我已经回答了这个问题,提到VTABLE可能没有区别,期望c#中没有Virtual Destructor.

iam*_*ind 3

(1)在 C# 中,可以选择基类中的函数overridevirtual基方法和派生方法都可以具有相同的语法,但派生方法只有在其前面使用关键字时才能参与多态性override。有关更多详细信息,请参阅此答案。

在C++中,如果派生类中提供了与基类方法相同的语法方法virtual;那么它将被自动覆盖。没有选择。

(2)简而言之,在 C# 中我们有abstract方法,而在 C++ 中我们有纯 virtual方法。两者可能不完全相同,但等效(因为 purevirtual可以有函数体)。

(3)在C++中,我们可以选择调用virtual方法而不让其参与多态性。例如,使用对象调用,在构造函数内部调用

(4)在 C++ 中,如果使用基虚方法public和派生方法,则当使用基句柄(指针或引用)调用方法时,机制上private没有区别。virtual这意味着它们的访问说明符可以不同。


现在来回答第二个问题,即如何vtable实施。这并不是一个真正客观的问题。因为在 C++ 本身中,不同的供应商vtable以不同的方式实现(它不是 @littleadve 指出的标准)。因此,为了面试的目的,您可以回答,vtables 是依赖于平台的。