在派生 类 之间复制共享变量(浅拷贝就足够了)
Copying shared variables between derived classes (shallow copy is enough)
所以,我有一个 Base class 和两个 Derived class,我们称它们为 Deriv1 和 Deriv2。
假设 Base class 有很多(受保护或 public)变量,这些变量当然也包含在 Deriv1 和 Deriv2 中。
现在假设我有一个 Deriv1 实例。来自 Base class 的数十亿个变量都填充了单独的值。现在我想使用这些共享值创建一个 Deriv2 实例。
现在我的问题是:如何将 Deriv1 的基础 class 部分复制到 Deriv2 ,而无需 编写赋值运算符,我必须在其中手动列出所有数十亿个 Base class 变量(并在每次我更改 Base class 中的内容时更新它)?有没有办法做到这一点,不管脏不脏?
我最初的想法是:
Deriv1 drv1;
... // actions regarding drv1, like changing variables
Base tempbase = drv1; // slicing off the non-base parts of Deriv1
Deriv2 drv2 = *dynamic_cast<Deriv2*>(&tempbase); // downcast
这没有用。它确实编译了(我不得不为它添加一个虚拟虚拟函数到 Base),但在运行时,它说 "access violation",所以我猜 dynamic_cast 返回了一个空指针。我尝试在 dynamic_cast 中使用引用而不是指针,这也没有用。
您可以使用基础 class 的(隐式定义的)复制构造函数,它按值(即浅拷贝)复制所有成员(甚至是私有成员)。您也可以为基础 class 定义一个显式复制构造函数,但在您的情况下似乎没有必要。
请参阅以下示例:
class A {
public:
A (int x, int y) : x(x), y(y) { };
// implicitly defined: A (const A &anA) : x(anA.x), y(anA.y) { }
private:
int x, y;
};
class B : public A {
public:
int z;
B(const A&anA) : A(anA) { }
B(const B&b, int z) : A(b), z(z) { }
};
class C : public A {
public:
int anythingElse;
C(const A&anA) : A(anA) { }
};
int main()
{
A a(10,20); // a.x = 10; a.y = 20
B b1(a); // b1.x = 10, b1.y = 20, b1.z = undefined.
B b2(b1,30); // b2.x = 10, b2.y = 20, b2.z = 30.
C c(b1); // c.x = 10; c.y = 20; c.anythingElse = undefined
return 0;
}
使用 static_cast 而不是 dynamic_cast 将解决此问题。
所以,我有一个 Base class 和两个 Derived class,我们称它们为 Deriv1 和 Deriv2。
假设 Base class 有很多(受保护或 public)变量,这些变量当然也包含在 Deriv1 和 Deriv2 中。
现在假设我有一个 Deriv1 实例。来自 Base class 的数十亿个变量都填充了单独的值。现在我想使用这些共享值创建一个 Deriv2 实例。
现在我的问题是:如何将 Deriv1 的基础 class 部分复制到 Deriv2 ,而无需 编写赋值运算符,我必须在其中手动列出所有数十亿个 Base class 变量(并在每次我更改 Base class 中的内容时更新它)?有没有办法做到这一点,不管脏不脏?
我最初的想法是:
Deriv1 drv1;
... // actions regarding drv1, like changing variables
Base tempbase = drv1; // slicing off the non-base parts of Deriv1
Deriv2 drv2 = *dynamic_cast<Deriv2*>(&tempbase); // downcast
这没有用。它确实编译了(我不得不为它添加一个虚拟虚拟函数到 Base),但在运行时,它说 "access violation",所以我猜 dynamic_cast 返回了一个空指针。我尝试在 dynamic_cast 中使用引用而不是指针,这也没有用。
您可以使用基础 class 的(隐式定义的)复制构造函数,它按值(即浅拷贝)复制所有成员(甚至是私有成员)。您也可以为基础 class 定义一个显式复制构造函数,但在您的情况下似乎没有必要。 请参阅以下示例:
class A {
public:
A (int x, int y) : x(x), y(y) { };
// implicitly defined: A (const A &anA) : x(anA.x), y(anA.y) { }
private:
int x, y;
};
class B : public A {
public:
int z;
B(const A&anA) : A(anA) { }
B(const B&b, int z) : A(b), z(z) { }
};
class C : public A {
public:
int anythingElse;
C(const A&anA) : A(anA) { }
};
int main()
{
A a(10,20); // a.x = 10; a.y = 20
B b1(a); // b1.x = 10, b1.y = 20, b1.z = undefined.
B b2(b1,30); // b2.x = 10, b2.y = 20, b2.z = 30.
C c(b1); // c.x = 10; c.y = 20; c.anythingElse = undefined
return 0;
}
使用 static_cast 而不是 dynamic_cast 将解决此问题。