设置具有多个固有性的基类的范例方法

Paradigmatic way to set base class with multiple inhertiance

本文关键字:基类 范例 方法 固有性 设置      更新时间:2023-10-16

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

#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;
}
这可能

static_cast更安全:

template<class T, class U>
T implicit_cast(U&& u){return std::forward<U>(u);}

因为它除了隐式投射之外什么都做不了。

implicit_cast<B&>(myC)= myB

一般来说,你甚至想这样做的事实是一种代码气味,因为赋值运算符和类层次结构通常不能很好地混合。

但是,一种方法是为类C提供适当的赋值运算符。 一个接受类型 const A & 的参数,另一个接受const B &。 然后

myC = some_a;
myC = some_b;

将起作用,无需使用隐式或显式强制转换。

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

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