如何在 C++ 中使用 parent class 作为继承的 child class 的参数?

how to use a parent class as a parameter in an inherited child class in c++?

这可能不是个好问题,我知道我需要更多时间来了解它
但我真的很想知道如何让它发挥作用
这是我的代码

#include <bits/stdc++.h>
using namespace std;
class Parent{
    protected:
        int value;
        int size;
    public:
        Parent();
        Parent(const Parent &p);
};
Parent::Parent()
{
    this->value = 0;
    this->size = 0;
}
Parent::Parent(const Parent &p)
{
    this->value = p.value;
    this->size = p.size;
}
class Child:public Parent{
    public:
        Child();
        Child(const Parent& p);
};
Child::Child()
{
    this->value = 0;
    this->size = 0;
}
Child::Child(const Parent& p)
{
    this->value = ??
    this->size = ?? 
}

因为我想在继承 child class,
中使用 parent class 作为参数 问题是我无法在 child class 中使用 p.size 或 p.value。
有什么办法可以解决这个问题吗?
感谢您阅读本文。

当您实现 class 时,您还必须在每个派生的 class 构造函数中使用它的构造函数。

你的情况:Child::Child(const Parent& p) : Parent(p) {}

这个Child(const Parent& p);不是一个合适的拷贝构造函数。 class T 的复制构造函数将 &T(可能带有 CV-qualifier)作为参数。在这种情况下,它应该是 Child(const Child& p);.

此外,如果我们查看https://en.cppreference.com/w/cpp/language/access,那么我们可以看到:

A protected member of a class is only accessible

  1. to the members and friends of that class;
  2. to the members and friends (until C++17) of any derived class of that class, but only when the class of the object through which the protected member is accessed is that derived class or a derived class of that derived class

所以 Child 中接受 Child 作为参数的函数可以访问其他 Child 的受保护成员,但是接受 Parent 的函数可以无法访问 Parent 的受保护成员。

例如,如果您有一个 ButtonTextBox 都继承自 UIWidget,那么 Button 可以访问 UIWidget 中受保护的成员其他 Buttons,但不在 TextBoxes.

编辑:

如果你真的想要一个以 Parent 作为参数的构造函数,那么你可以按照 Roy Avidan 在他的回答中建议的那样做,然后这样做:

Child::Child(const Parent& p)
: Parent(p)  // <- Call the Parent copy constructor
{
  // No access to protected members of p here!
}

这是有效的,因为它使用 Parent 参数调用 Parent 的复制构造函数,这意味着对 Parent 的受保护成员的任何访问都发生在 Parent 中.请注意,对正文中 p 的受保护成员的任何访问都是对 p.

的访问冲突