144.34.164.217
假设现在有如下代码:
struct A
{
A() { std::cout << "A default constructer\n"; }
A(int i) { std::cout << "A constructer\n"; a = 1; }
int a;
};
struct B
{
B() { std::cout << "B default constructer\n"; }
B(int i) { std::cout << "B constructer\n"; a = 1; }
int a;
};
struct C :A, B
{
using A::A;
using B::B;
C() { a = 0; }
int a;
};
编译报错:
大概意思就是函数冲突了
这里发生冲突的函数就是A和B的含参构造函数,你可以能会问,他们两个只有参数一样,但是函数名并不一样啊,一个是A一个是B,这里需要注意的是,到了派生类这里,构造函数的函数名就相当于是忽略的了,全都是一样的,至于是什么名字,我也不知道
那么为什么是含参构造函数发生了冲突呢,原因就是派生类C并没有实现自己的含参构造函数,A和B的默认构造函数之所以不会冲突,是因为被C的默认构造函数覆盖掉了,所以不会报错
那么分析清楚了原因之后,就可以对症下药了,如果你把A或者B的含参构造函数的参数类型做一下更改,就可以正常编译了
如下:
struct A
{
A() { std::cout << "A default constructer\n"; }
A(int i) { std::cout << "A constructer\n"; a = 1; }
int a;
};
struct B
{
B() { std::cout << "B default constructer\n"; }
B(float i) { std::cout << "B constructer\n"; a = 1; }
int a;
};
struct C :A, B
{
using A::A;
using B::B;
C() { a = 0; }
int a;
};
或者,再给C实现一个含参构造函数
struct A
{
A() { std::cout << "A default constructer\n"; }
A(int i) { std::cout << "A constructer\n"; a = 1; }
int a;
};
struct B
{
B() { std::cout << "B default constructer\n"; }
B(int i) { std::cout << "B constructer\n"; a = 1; }
int a;
};
struct C :A, B
{
using A::A;
using B::B;
C(int i) { a = i; }
int a;
};