设置具有多个不连续性的基类的范式方法

时间:2016-03-06 05:02:51

标签: c++

我想知道以下是否是在多重继承的情况下设置基类的范例方法。这种方法有什么缺陷吗?

#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;
}

2 个答案:

答案 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;

可以使用,无需使用隐式或显式转换。

如果您在实现此类赋值运算符时遇到问题,那通常表明您的设计出现了更多错误。对于这种格式,这种困难可能表明的问题列表太长了。

请记住,实际上,如果需要赋值运算符,那么相应的构造函数和(可能)移动构造函数也是如此。