首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟基类与继承

虚拟基类与继承
EN

Stack Overflow用户
提问于 2017-04-05 06:24:25
回答 2查看 104关注 0票数 0

当我翻阅时,我发现了这个问题。

代码语言:javascript
复制
#include <iostream>

using namespace std;

class base
{
   public:
      base()
      {
         cout << "ctor in base class\n";
      }
};

class derived1 : public base
{
   public:
      derived1()
      {
         cout <<"ctor in derived class\n";
      }
};

int main()
{
   derived1 d1obj;
   return 0;
}

有一个问题:-当创建d1obj时,控件首先到达基类构造函数,然后转到派生类构造函数?或者是相反的情况:它首先到达派生类构造函数,发现它有基类,因此控件转到基类中的构造函数?

而这个系统包含了部分

当类具有虚拟基时,构造函数通常会导致两个不同的函数体被发出--一个用于这个类是派生最多的类型,另一个用于这个类本身是一个基类。原因是虚拟基类是由派生最多的类构造的,以确保当它们被共享时只构造一次。因此,构造函数的第一个版本将调用所有基类构造函数,而第二个版本只调用非虚拟基的构造函数。

有人能举个例子向我解释一下吗?

Here是这个问题的链接

EN

回答 2

Stack Overflow用户

发布于 2017-04-05 08:06:10

在您的示例中,负责调用derived1的默认构造函数的是base的默认构造函数。但是,只有当derived1是实际的(大部分派生的)对象时,这才是必要的,如您的示例所示

代码语言:javascript
复制
int main()
{
  derived1 d1obj; // Most derived object of type `derived1`
  // It contains a direct `base` subobject
  // Constructor of `derived1` must construct `base` subobject as well
} 

但是当使用derived1时,一个较大对象的基子对象

代码语言:javascript
复制
class derived2 : public derived1
{
public:
  derived2()
  {
     cout <<"ctor in derived 2 class\n";
  }    
};

int main()
{
  derived2 d2obj; // Most derived object of type `derived2`
  // It contains a direct `derived1` subobject and an indirect `base` subobject 
  // (through `derived1`)
  // Constructor of `derived2` must directly construct both `derived1` subobject and 
  // `base` subobject 
  // Which means that constructor of `derived1` subobject should not attempt
  // to construct `base` subobject
}

然后,derived2的构造函数负责调用derived1的默认构造函数和默认的构造函数base。在这种情况下,derived1的默认构造函数不应调用base的构造函数,因为它将导致base的双重构造。

为了满足所有这些要求,derived1通常有两个版本的默认构造函数:原始示例中调用的完整版本和上面示例中从derived2调用的“缩减”版本。

或者,derived1的默认构造函数可以使用隐藏的布尔参数来实现,这将告诉它是否调用base的默认构造器。

票数 1
EN

Stack Overflow用户

发布于 2017-04-05 06:43:19

“当类具有虚拟基时,构造函数通常会产生两个不同的函数体--一个用于这个类是派生最多的类型时使用,另一个用于这个类本身是一个基类。原因是虚拟基类是由派生最多的类构造的,以确保当它们共享时只构造一次。因此构造函数的第一个版本将调用所有基类构造函数,而第二个版本只调用非虚拟基的构造函数。”

在这种情况下,回答者实际上想说的是C++中常见的一种情况,即多重继承中的可怕钻石。要理解这个链接,只需查看对此链接In C++, what is a virtual base class?最不满意的答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43223348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档