gpt4 book ai didi

c++ 用作虚拟基础的类可以具有带参数的构造函数吗?

转载 作者:行者123 更新时间:2023-11-30 01:12:29 26 4
gpt4 key购买 nike

我是 C++ 新手,我正在尝试构建一个多重继承类,其中包含一个通用的虚拟继承类(请参见下面的代码)。我的书礼貌地忽略了虚拟继承类的构造函数具有参数的情况。下面的代码是我尝试这样做的。如果我在两个派生类中删除类基的虚拟继承,代码构建正常。但是,如果我保持原样,它将无法构建。(ubuntu 下的 g++)

我有几个问题:

1) 最不重要优先:为什么代码没有构建?

2)虚继承类可以有带参数的构造函数吗?

3) 如果问题 2) 为真,那么下面一行是如何求值的?

derived(int i,int j, int k):derived1(i,j),derived2(j,k){};

每个派生类调用基类构造函数,每个都有第二个参数。但是派生中只有一个基的拷贝存在,因为它是作为虚拟继承的。我想了解在这种情况下执行了哪些基本构造函数以及使用什么参数:j 或 k? (我不确定这条线是否有效)。

#include <iostream>
using namespace std;

class base
{
int x;
public:
base(int i){cout<<"Constructing base "<<i<<endl;x=i;}
~base(){cout<<"Destructing base"<<endl;}
};

class derived1:virtual public base
{
int x1;
public:
derived1(int i,int j): base(j){cout<<"Constructing derived1 " <<i<<endl;x1=i;}
~derived1(){cout<<"Destructing derived1"<<endl;}
};

class derived2:virtual public base
{
int x2;
public:
derived2(int i,int j): base(j){cout<<"Constructing derived2 "<<i<<endl;x2=i;}
~derived2(){cout<<"Destructing derived2"<<endl;}
};

class derived:public derived1, public derived2
{
int z;
public:
derived(int i,int j, int k):derived1(i,j),derived2(j,k){cout<<"Constructing derived "<<k<<endl;z=k;}
~derived(){cout<<"Destructing derived"<<endl;}
};

int main()
{
derived ob(2,3,4);
}

最佳答案

层次结构中的任何类都可以在其 mem-initializer-list(: 之后的构造函数定义部分)中列出其虚拟基类,但只有其中一个会实际执行这些构造函数:最派生类。

让我们想象这样的设置:

#include <iostream>

struct V
{
explicit V(char c) { std::cout << c << '\n'; }
};

struct A : virtual V
{
A() : V('a') {}
};

struct B : A, virtual V
{
B() : V('b') {}
};

struct C : B
{
C() : V('c') {}
};

int main()
{
A a; // prints 'a'
B b; // prints 'b'
C c; // prints 'c'
}

[Live example]

如您所见,即使所有 A , B , 和 C初始化 V在它们的构造函数中,只有最派生的类(您实际创建的对象的类型)执行它的初始化程序。

现在假设我们添加一个类 D像这样:

struct D : C
{
D() {}
};

这将 not compileD不列出V在其 mem-initializer-list 中,因此将使用默认构造函数,但它不存在。


derived 解决您的具体示例来自derived1derived2 : 创建类型为 derived 的对象时, derived是派生程度最高的类型,因此只有 derived 的构造函数本身可以将参数传递给 base构造函数。 base 的任何初始化在 derived1 的构造函数中和 derived2创建 derived 时将被忽略对象。

关于c++ 用作虚拟基础的类可以具有带参数的构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com