如何在 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
- to the members and
friends of that class;
- 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
的受保护成员。
例如,如果您有一个 Button
和 TextBox
都继承自 UIWidget
,那么 Button
可以访问 UIWidget
中受保护的成员其他 Button
s,但不在 TextBox
es.
编辑:
如果你真的想要一个以 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
.
的访问冲突
这可能不是个好问题,我知道我需要更多时间来了解它
但我真的很想知道如何让它发挥作用
这是我的代码
#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
- to the members and friends of that class;
- 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
的受保护成员。
例如,如果您有一个 Button
和 TextBox
都继承自 UIWidget
,那么 Button
可以访问 UIWidget
中受保护的成员其他 Button
s,但不在 TextBox
es.
编辑:
如果你真的想要一个以 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
.