设置具有多个固有性的基类的范例方法
Paradigmatic way to set base class with multiple inhertiance
我想知道以下是否是在多重继承的情况下设置基类的范例方法。这种方法有什么缺陷吗?
#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;
将起作用,无需使用隐式或显式强制转换。
如果您在实现这样的赋值运算符时遇到问题,那么这通常表明您的设计存在更多问题。 对于这种格式来说,这种困难可能表明的问题列表太长了。
请记住,实际上,如果需要赋值运算符,则相应的构造函数和(可能)移动构造函数也是如此。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 设置具有多个固有性的基类的范例方法