我想知道以下是否是在多重继承的情况下设置基类的范例方法。这种方法有什么缺陷吗?
#include <iostream>
struct A
{
int one, two;
};
struct B
{
int three, four;
};
struct C : A, B
{
C(int One, int Two, int Three, int Four) : A({ One, Two }),B({ Three, Four }){}
};
int main(int argc, char *argv[])
{
C myC( 1, 2, 3, 4);
//a lot of code here
B myB={ 9, 10 };
static_cast<B&>(myC)= myB;//Code smell?
std::cout << myC.three <<","<<myC.four<< std::endl;
return 0;
}
答案 0 :(得分:1)
这可能比static_cast
更安全:
template<class T, class U>
T implicit_cast(U&& u){return std::forward<U>(u);}
因为除了隐式演员之外它不能做任何其他事情。
implicit_cast<B&>(myC)= myB
答案 1 :(得分:0)
一般来说,您甚至想要这样做的事实是代码气味,因为赋值运算符和类层次结构通常不能很好地混合。
但是,一种方法是提供类C
适当的赋值运算符。一个接受const A &
类型的参数,另一个接受const B &
的参数。然后
myC = some_a;
myC = some_b;
可以使用,无需使用隐式或显式转换。
如果您在实现此类赋值运算符时遇到问题,那通常表明您的设计出现了更多错误。对于这种格式,这种困难可能表明的问题列表太长了。
请记住,实际上,如果需要赋值运算符,那么相应的构造函数和(可能)移动构造函数也是如此。