Difference in Compiler Behaviour in case of VIRTUAL Functions in C# and C++. This i was asked in a Interview
C++和C语言中的虚拟如何不同?基本上我想知道Vtable在C和C++中的表达方式有什么不同吗?另外,编译器在C语言和C++中创建V表的方式有什么不同吗?
基本上,面试官想知道在C语言和C++的情况下,编译器的行为对于虚拟函数是如何不同的。
我已经回答了一个问题,提到vtable中可能没有区别,期望在c中没有虚拟析构函数。
你可以调用C语言中的构造函数中的虚函数(通过虚拟调度机制得到调用的预期行为),而不是C++。
尽管不建议这样做。
谁说过V形桌的事?你为什么要假设他们的存在?
主要的区别(与语法有关)是,在C++中,派生类不必知道函数在祖先类中被声明为EDOCX1×0,而在C语言中,必须使用EDCOX1×1 }关键字。
马丁的回答是正确的,但值得进一步解释。
假设vtables是用于解析虚拟方法调用的机制。这将使讨论更容易。
在C++中,继承层次结构中的每个构造函数都执行以下操作:
vtable指针在类初始化过程中发生更改。当调用每个基类构造函数时,vtable"演化"为它的最派生形式。
在C中,在调用任何构造函数代码之前,vtable指针只设置一次。对于层次结构中的每个类构造函数,仅发生上面描述的步骤1和3。
通过在这里做出不同的设计决定,C++和C基本上选择了不同的、必要的邪恶。
在C++中,有一个坏程序员可能调用纯虚拟(A.K.A.摘要)方法的风险。当基类构造函数调用在更派生的类中实现的虚拟方法时,就会发生这种情况。C++也有可能调用重写的虚拟方法。
C做事方式的危险更加微妙,但仍然存在潜在问题。如果基类构造函数调用虚拟方法,则在更派生类的构造函数中完成任何初始化之前调用该方法。这可能会违反更派生类的作者设计的预期用法。
(1)在c中,可以从基类中选择
在C++中,如果在派生类中提供相同的语法方法作为基类EDCOX1×0的方法,那么它将被自动重写。别无选择。
(2)在C中,我们有EDOCX1,6种方法和C++纯EDCX1,0种方法。两者可能不完全相同,但是等效的(因为纯
(3)在C++中,我们可以选择调用EDOCX1·0的方法,而不让它参与多态性。例如,使用对象调用,在构造函数内部调用。
(4)在C++中,如果基本虚方法是EDOCX1,则10,派生方法是EDCOX1,11比EDCOX1,0,0的机制没有差异,当方法用基本句柄(指针或引用)调用时。这意味着它们的访问说明符可以是不同的。
现在我们来讨论第二个问题,即如何实施