谁能解释一下下面的多重继承,为什么即使vehicle类是用参数化构造函数构造的,也不能调用d类的参数化构造函数。
#include<iostream>
using namespace std;
class d{
public:
d()
{
cout<<"in default constructor of d"<<endl;
}
d(int x)
{
cout<<"in parametrized constructor of d"<<endl;
}
void a()
{
cout<<"a function of d";
}
};
class Vehical:virtual public d
{
public:
Vehical(int x):d(x)
{
cout<<"In paramterized constructor of Vehical" <<endl;
}
void a()
{
cout <<"a function of Vehical class"<<endl;
}
Vehical()
{
cout<<"default constructor of Vehical"<<endl;
}
};
class now: virtual public d
{
public:
void a()
{
cout <<"a function of now "<<endl;
}
now()
{
cout<<"Default constructor of now" <<endl;
}
};
class car :public Vehical, public now
{
public:
car();
car(int y):Vehical(y)
{
};
//using d::a;
using Vehical::a;
};
int main()
{
car ob(1);
ob.a();
return 0;
}输出:
in default constructor of d
In paramterized constructor of Vehical
Default constructor of now期望:它应该调用D的参数化构造函数,而不是默认的,因为我们是通过传递参数来构造vehicle的,这实际上调用了D类的参数化构造函数。
另外,如果我们删除一个类的虚拟,我们又会有菱形问题?为什么会这样呢?
场景1):如果我们从vehicle类中删除virtual,我们会得到以下输出
in default constructor of d
in parametrized constructor of d
In paramterized constructor of Vehical
Default constructor of now
a function of Vehical class同样在上面的输出中,为什么先调用默认构造函数,然后调用d类的参数化?也是在输出中,为什么先调用d的构造函数,然后调用vehicle,现在调用类构造函数。
期望:它应该先调用d的参数化构造函数,然后参数化车辆的构造函数,然后调用d的默认构造函数,然后调用now的默认构造函数。
场景2),现在我们从now类中删除了virtual类,我们得到了输出,其中调用了d的默认构造函数,而不是paramterize?
in default constructor of d
In paramterized constructor of Vehical
in default constructor of d
Default constructor of now
a function of Vehical class期望:它应该调用D的参数化构造函数,而不是第一行的默认构造函数。
发布于 2018-09-17 20:59:08
在“可怕的死亡之钻”中有两个问题:
1.基类的不确定度-当引用这个“祖父”类时,应该选择哪个基类的基类。
2.父类的构造函数在显式调用基类构造函数时使用哪个。想象一下下面的例子:
class foo{
public:
foo() { }
foo(int x) { }
};
class bar : virtual public foo
{
public:
using foo::foo;
};
class baz: virtual public foo
{
public:
using foo::foo;
};
class clazz :public bar, public baz
{
public:
clazz(int i) : bar(i), baz(i+1){}
};当只创建一个祖父时,编译器应该选择foo的哪个构造函数?好吧,任何选择都意味着解决冲突的foo构造函数调用之间的竞争(通过冲突,我是指使用不同的参数)。C++中的语言设计选择是-不要试图解决contest,只需将初始化父类的责任放在程序员身上。这是有意义的,因为菱形继承是一种特殊的情况,可能需要特殊的初始化方式。
您必须在孙子类构造函数中显式调用d构造函数:
#include<iostream>
using namespace std;
class d{
public:
d()
{
cout<<"in default constructor of d"<<endl;
}
d(int x)
{
cout<<"in parametrized constructor of d"<<endl;
}
void a()
{
cout<<"a function of d";
}
};
class Vehical:virtual public d
{
public:
Vehical(int x):d(x)
{
cout<<"In paramterized constructor of Vehical" <<endl;
}
void a()
{
cout <<"a function of Vehical class"<<endl;
}
Vehical()
{
cout<<"default constructor of Vehical"<<endl;
}
};
class now: virtual public d
{
public:
void a()
{
cout <<"a function of now "<<endl;
}
now()
{
cout<<"Default constructor of now" <<endl;
}
};
class car :public Vehical, public now
{
public:
car();
car(int y):Vehical(y), d(y)
{
};
//using d::a;
using Vehical::a;
};
int main()
{
car ob(1);
ob.a();
return 0;
}https://stackoverflow.com/questions/52368216
复制相似问题