【发布时间】:2023-04-10 20:22:01
【问题描述】:
我正在编写一个 C++ 程序,其中我有两个来自基类的派生对象,例如 Derived_1 和 Derived_2。
在处理过程中,第一个对象调整基础数据成员(这里只是模拟使用 Derived_1 的默认构造函数)。然后我想做的是从 Derived_1 对象中读取该数据,并在 Derived_2 的构造函数中使用它来初始化 Derived_2 中的相同成员。
// -std=c++14
#include <iostream>
class Base {
public:
int data(void) { return data_; }
protected:
int data_{0};
};
class Derived_1 : public Base {
public:
Derived_1(void) { this->data_ = 42; }
};
class Derived_2 : public Base {
public:
// Derived_2(const Derived_1& a1) { this->data_ = a1.data_; }
};
int main() {
Derived_1 a1;
std::cout << "Derived_1 data: " << a1.data() << '\n';
// Derived_2 a2 = a1;
// std::cout << "Derived_2 data: " << a2.data() << '\n';
}
如果Derived_2中的构造函数没有注释,就会出现这个错误:
In constructor ‘Derived_2::Derived_2(const Derived_1&)’:
error: ‘int Base::data_’ is protected within this context
Derived_2(const Derived_1& a1) { this->data_ = a1.data_; }
^~~~~
我在这里查看了一些关于 SO 试图找到解决方案的相关问题,(例如) Access a derived private member function from a base class pointer to a derived object 和 Why can I access a derived private member function via a base class pointer to a derived object? 但如果我看到了答案,我目前很难找到答案。可能只是我的经验不足。
感谢您帮我解决这个问题。
【问题讨论】:
-
您无法访问其他类型的受保护成员,只能访问您自己的类型。
-
感谢 Tavian 的回复。
-
Derived_2(const Derived_1&)不是复制构造函数。 -
@aschepler 感谢您指出这一点。
-
@aschepler 问题已编辑以反映您的观点,谢谢。
标签: c++ c++11 inheritance