Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何根据基类对象中变量的值在派生类中分配变量?_C++_Oop_Polymorphism - Fatal编程技术网

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重载的赋值运算符肯定会起作用。然而,我担心读者可能会对赋值运算符的作用做出错误的假设,而不是费心去实际查看重载的赋值运算符。虽然这是一种更具可读性的编写示例的方法,但它并没有解决这个问题。在我看来,这应该是一个注释。我认为您的代码可能更具可读性,但仍然有点混乱。您是否认为使用子构造函数将是完成此任务的一种更常见的实践/可读方式?虽然这是编写示例的一种更可读的方式,但它并没有解决这个问题。在我看来,这应该是一个注释。我认为您的代码可能更具可读性,但仍然有点混乱。您是否认为使用子构造函数将是完成此任务的更常见的实践/可读方式?