C++ 如何根据基类对象中变量的值在派生类中分配变量?
最近在工作中我遇到了这段代码(这是一个人为的例子,但基本上是做同样的事情): 如上所述,C++ 如何根据基类对象中变量的值在派生类中分配变量?,c++,oop,polymorphism,C++,Oop,Polymorphism,最近在工作中我遇到了这段代码(这是一个人为的例子,但基本上是做同样的事情): 如上所述,a中的所有成员变量都被复制到b中相应的成员变量中,因为b是从a派生出来的,并且b类型的所有对象都保证至少具有与a类型的对象相同的所有成员变量 在实际代码中,A有足够的变量,手动分配每个变量并不理想 在与它斗争了一段时间后,我能够理解代码在做什么,但它花了我几秒钟多的时间这一事实似乎是一个危险信号 P>有其他方法来做这个代码所做的事情吗?这可能更容易理解,或者更符合C++的常见做法?以这种方式分配变量是常见的
a
中的所有成员变量都被复制到b
中相应的成员变量中,因为b
是从a
派生出来的,并且b
类型的所有对象都保证至少具有与a
类型的对象相同的所有成员变量
在实际代码中,A
有足够的变量,手动分配每个变量并不理想
在与它斗争了一段时间后,我能够理解代码在做什么,但它花了我几秒钟多的时间这一事实似乎是一个危险信号
<> P>有其他方法来做这个代码所做的事情吗?这可能更容易理解,或者更符合C++的常见做法?以这种方式分配变量是常见的吗
编辑:有人建议我的问题可能是重复的,我问的是什么是对象切片。这不是对象切片,因为我在任何时候都不会将派生类型的对象指定给基类型的对象。因此,在代码中没有任何信息是“切片”或丢失的。 我会说使用这样的指针操作来完成赋值在C++中是不常见的。 另一种方法是用演员阵容明确地表达你的意图。我不完全确定它是否更具可读性:
A a;
a.foo = 1000;
B b;
static_cast<A&>(b) = a;
A;
a、 foo=1000;
B B;
静态_cast(b)=a;
但是,根据您的具体需要,您可能会更好地使用子构造函数,该构造函数接受父构造函数并适当地构造自身。这样,你就不必默认构造孩子,然后将父成员分配为第二步骤。 < P>我会说使用这样的指针操作来完成分配实际上在C++中是不常见的。 另一种方法是用演员阵容明确地表达你的意图。我不完全确定它是否更具可读性:
A a;
a.foo = 1000;
B b;
static_cast<A&>(b) = a;
A;
a、 foo=1000;
B B;
静态_cast(b)=a;
但是,根据您的具体需要,您可能会更好地使用子构造函数,该构造函数接受父构造函数并适当地构造自身。这样,您就不需要默认构造子对象,然后作为第二步分配父成员。如果
a_ptr
只起临时作用,将a
类成员分配给B
对象,以后的代码只使用B
,我建议为B
创建一个构造函数,它接受a
对象。如果没有其他内容,它提供了比当前更好的可读性
class A
{
public:
int foo;
};
class B: public A
{
public:
B(const A &a)
{
A* a_ptr = this;
*a_ptr = a;
}
int bar;
};
int main()
{
A a;
a.foo = 1000;
// Create B with copy of 'a' members
B b(a);
}
如果
a_ptr
除了临时将a
类成员分配给B
对象,并且以后的代码只使用B
,我建议为B
创建一个构造函数,该构造函数接受a
对象。如果没有其他内容,它提供了比当前更好的可读性
class A
{
public:
int foo;
};
class B: public A
{
public:
B(const A &a)
{
A* a_ptr = this;
*a_ptr = a;
}
int bar;
};
int main()
{
A a;
a.foo = 1000;
// Create B with copy of 'a' members
B b(a);
}
为什么不重载赋值运算符?@Nathan重载做什么?我编辑了我的问题,以澄清这不是对象切片。这与对象切片有点相反。请仔细阅读代码。@NeilButterworth做作业。他们可以添加一个
派生的&operator=(base&b)
,然后他们可以将一个base分配给派生的&operator。@NathanOliver重载的赋值运算符肯定会起作用。但是,我担心读者可能会对赋值运算符正在执行的操作做出错误的假设,而不是费心实际查看重载的赋值运算符。为什么不重载赋值运算符?@Nathan overload to do what?我编辑了我的问题,以澄清这不是对象切片。这与对象切片有点相反。请仔细阅读代码。@NeilButterworth做作业。他们可以添加一个派生的&operator=(base&b)
,然后他们可以将一个base分配给派生的&operator。@NathanOliver重载的赋值运算符肯定会起作用。然而,我担心读者可能会对赋值运算符的作用做出错误的假设,而不是费心去实际查看重载的赋值运算符。虽然这是一种更具可读性的编写示例的方法,但它并没有解决这个问题。在我看来,这应该是一个注释。我认为您的代码可能更具可读性,但仍然有点混乱。您是否认为使用子构造函数将是完成此任务的一种更常见的实践/可读方式?虽然这是编写示例的一种更可读的方式,但它并没有解决这个问题。在我看来,这应该是一个注释。我认为您的代码可能更具可读性,但仍然有点混乱。您是否认为使用子构造函数将是完成此任务的更常见的实践/可读方式?