如何在成员函数中访问具有匹配子成员名称的祖父级的成员?

How do you access a member from a grandparent in a member function with a matching child member name?

提问人:pandaero 提问时间:2/16/2023 更新时间:2/16/2023 访问量:43

问:

我在课程设置中遇到了钻石问题。为简单起见:

class   GrandParent
{
    public:
        ...
    protected:
        std::string name;
        int         age;
};

class   Parent1: virtual public GrandParent
{
    public:
        ...
};

class   Parent2: virtual public GrandParent
{
    public:
        ...
};

class   Child: public Parent1, public Parent2
{
    public:
        Child(void);
        Child(const Child & other);
        ~Child(void);
        Child & operator=(const Child & other);

    private:
        std::string name;
};

它们都具有规范的正统形式,以及一些额外的成员功能。

我的问题出现在类的复制分配运算符上:(需要帮助解决双 exlcamation 标记之间的内容!!Child

Child & Child::operator=(const Child & other)
{
    std::cout << "Child Copy assignment operator called" << std::endl;
    if (this != &other)
    {
        name = !!other.name!!;
        GrandParent::name = !!other.name!!;
        GrandParent::age = other.age;
    }
    return (*this);
}

如何正确区分这些?

C ++98

评论

0赞 Pepijn Kramer 2/16/2023
不要将基因遗传与类遗传混淆。你在那里的所有职业都是人类。因此,为一个人创建一个类,然后单独对关系进行建模(例如,在简单的情况下,作为引用其他人的成员变量)。钻石继承实在是太痛苦了,IMO的人认为OO只是关于继承,而它几乎从来都不是最好的解决方案
0赞 sweenish 2/16/2023
更好的问题是,为什么派生类首先具有该数据成员。似乎充其量是糟糕的命名,否则设计也很糟糕。
0赞 pandaero 2/16/2023
命名与任何事情无关,我只是认为提出这一点并引用“父”类会很好。Grandparent 和 Parent1 和 Parent2 都具有不同的公共功能,包含在它们的“...”
0赞 Eljay 2/16/2023
Child(void);不需要那里,这不是惯用的 C++。 同样。void~Child(void);

答:

1赞 Sam Varshavchik 2/16/2023 #1

好吧,对于初学者来说,显示的代码不需要用户定义的赋值运算符。默认的会做正确的事情,所以:忘记整个事情。但是,据推测,必须有一个原因,因此手头的任务。

一个简单的方法是将每一步都传递给 C++ 编译器:

const GrandParent &other_grandparent=other;

GrandParent::name = other_grandparent.name;

当然,如果出于某种原因只需要用户定义的赋值运算符,但祖父级的默认赋值运算符可以完成这项工作,那么只需这样做:Child

GrandParent::operator=(other);
2赞 nielsen 2/16/2023 #2

根据我的理解,这个问题可以归结为:如何通过对象指针或引用来引用eclipse的成员变量。

答案是在引用变量时指定原始类:

Child & Child::operator=(const Child & other)
{
    std::cout << "Child Copy assignment operator called" << std::endl;
    if (this != &other)
    {
        name = other.Child::name;  // or just other.name which refers to the Child "name"
        GrandParent::name = other.GrandParent::name;
        GrandParent::age = other.age;
    }
    return (*this);
}```